annotate src/composite.c @ 112364:42e22c4f06b7

Move all DEFVAR'd globals into a structure -- threading infrastructure * globals.h: New file. * xterm.h (Vx_pixel_size_width_font_regexp): Remove declaration. * window.h (Vinitial_window_system, Vminibuf_scroll_window) (Vwindow_system_version): Remove declaration. * w32term.h (Vw32_enable_palette) (Vx_pixel_size_width_font_regexp): Remove declaration. * w32menu.c (Voverriding_local_map) (Voverriding_local_map_menu_flag): Remove declaration. * w32inevt.c (Vw32_alt_is_meta, Vw32_apps_modifier) (Vw32_capslock_is_shiftlock, Vw32_enable_caps_lock) (Vw32_enable_num_lock, Vw32_lwindow_modifier) (Vw32_pass_lwindow_to_system, Vw32_pass_rwindow_to_system) (Vw32_phantom_key_code, Vw32_recognize_altgr) (Vw32_rwindow_modifier, Vw32_scroll_lock_modifier) (w32_use_full_screen_buffer): Remove declaration. * w32.c (Vsystem_configuration, Vw32_downcase_file_names) (Vw32_generate_fake_inodes, Vw32_get_true_file_attributes) (w32_num_mouse_buttons, w32_pipe_read_delay): Remove declaration. * termopts.h (Vtruncate_partial_width_windows, inverse_video) (no_redraw_on_reenter, visible_bell): Remove declaration. * sysdep.c (Vsystem_name): Remove declaration. * syntax.h (parse_sexp_lookup_properties): Remove declaration. * menu.h (Vmenu_updating_frame): Remove declaration. * macros.h (Vexecuting_kbd_macro, executing_kbd_macro_index): Remove declaration. * lisp.h (Vafter_init_time, Vafter_load_alist) (Vauto_save_list_file_name, Vbefore_init_time, Vcommand_history) (Vcompletion_regexp_list, Vcurrent_load_list) (Vcurrent_prefix_arg, Vdata_directory, Vdebug_on_error) (Vdoc_directory, Vdoc_file_name, Vdynamic_library_alist) (Vexec_directory, Vexec_path, Vexec_suffixes) (Vface_font_rescale_alist, Vface_ignored_fonts, Vfeatures) (Vhelp_form, Vhistory_length, Vinhibit_field_text_motion) (Vinhibit_quit, Vinhibit_read_only, Vinhibit_redisplay) (Vinstallation_directory, Vinvocation_directory) (Vinvocation_name, Vload_file_rep_suffixes, Vload_history) (Vload_suffixes, Vmark_even_if_inactive, Vmemory_full) (Vmessage_log_max, Vobarray, Vprint_length, Vprint_level) (Vpurify_flag, Vquit_flag, Vsaved_region_selection) (Vscalable_fonts_allowed, Vselect_active_regions) (Vshell_file_name, Vstandard_input, Vstandard_output) (Vsystem_name, Vtemporary_file_directory, Vthrow_on_input) (Vtop_level, Vtty_erase_char, Vundo_outer_limit) (Vuser_login_name, Vwindow_scroll_functions) (Vwindow_system_version, Vx_no_window_manager) (Vx_resource_class, Vx_resource_name, baud_rate) (completion_ignore_case, debug_on_next_call, gc_cons_threshold) (history_delete_duplicates, inhibit_x_resources) (last_nonmenu_event, load_in_progress, max_specpdl_size) (minibuffer_auto_raise, print_escape_newlines, scroll_margin) (use_dialog_box, use_file_dialog): Remove declaration. Include globals.h. * keymap.h (Voverriding_local_map) (Voverriding_local_map_menu_flag, meta_prefix_char): Remove declaration. * keyboard.h (Vdouble_click_time, Vfunction_key_map) (Vinput_method_function, Vkey_translation_map) (Vlucid_menu_bar_dirty_flag, Vthis_original_command) (do_mouse_tracking, extra_keyboard_modifiers) (num_nonmacro_input_events): Remove declaration. * intervals.h (Vchar_property_alias_alist) (Vdefault_text_properties, Vinhibit_point_motion_hooks) (Vtext_property_default_nonsticky): Remove declaration. * gtkutil.h (x_gtk_file_dialog_help_text) (x_gtk_show_hidden_files, x_gtk_use_old_file_dialog) (x_gtk_whole_detached_tool_bar): Remove declaration. * frame.h (Vdefault_frame_alist, Vframe_alpha_lower_limit) (Vmenu_bar_mode, Vmouse_highlight, Vterminal_frame) (Vtool_bar_mode, Vx_resource_class, Vx_resource_name) (focus_follows_mouse): Remove declaration. * fontset.h (Valternate_fontname_alist, Vfontset_alias_alist) (Vignore_relative_composition, Votf_script_alist) (Vuse_default_ascent, Vvertical_centering_font_regexp): Remove declaration. * font.h (Vfont_log): Remove declaration. * dosfns.h (Vdos_display_scancodes, Vdos_version) (Vdos_windows_version, dos_codepage, dos_country_code) (dos_decimal_point, dos_hyper_key, dos_keyboard_layout) (dos_keypad_mode, dos_super_key, dos_timezone_offset): Remove declaration. * disptab.h (Vglyph_table, Vstandard_display_table): Remove declaration. * dispextern.h (Vface_remapping_alist, Vglyphless_char_display) (Vmouse_autoselect_window, Voverflow_newline_into_fringe) (Vshow_trailing_whitespace, Vtool_bar_button_margin) (Vtool_bar_style, cursor_in_echo_area, display_hourglass_p) (inverse_video, mode_line_in_non_selected_windows) (tool_bar_button_relief, tool_bar_max_label_size) (underline_minimum_offset) (unibyte_display_via_language_environment, x_stretch_cursor_p): Remove declaration. * composite.h (Vauto_composition_function) (Vcomposition_function_table): Remove declaration. * commands.h (Vexecuting_kbd_macro) (Vminibuffer_local_completion_map) (Vminibuffer_local_filename_completion_map) (Vminibuffer_local_filename_must_match_map) (Vminibuffer_local_map, Vminibuffer_local_must_match_map) (Vminibuffer_local_ns_map, Vthis_command) (Vunread_command_events, cursor_in_echo_area) (last_command_event, last_nonmenu_event, unread_command_char): Remove declaration. * coding.h (Vcoding_system_for_read, Vcoding_system_for_write) (Vdefault_file_name_coding_system) (Vdefault_process_coding_system, Vfile_name_coding_system) (Vlast_coding_system_used, Vlocale_coding_system) (Vselect_safe_coding_system_function) (Vtranslation_table_for_input, coding_system_require_warning) (eol_mnemonic_dos, eol_mnemonic_mac, eol_mnemonic_undecided) (eol_mnemonic_unix, inherit_process_coding_system): Remove declaration. * charset.h (Vcharset_list, Vcurrent_iso639_language): Remove declaration. * character.h (Vauto_fill_chars, Vchar_direction_table) (Vchar_script_table, Vchar_width_table, Vprintable_chars) (Vscript_representative_chars, Vtranslation_table_vector) (Vunicode_category_table): Remove declaration. * ccl.h (Vfont_ccl_encoder_alist): Remove declaration. * buffer.h (Vafter_change_functions, Vbefore_change_functions) (Vdeactivate_mark, Vfirst_change_hook, Vtransient_mark_mode) (inhibit_modification_hooks): Remove declaration. * xterm.c (syms_of_xterm): Update. (Vx_alt_keysym, Vx_hyper_keysym, Vx_keysym_table) (Vx_meta_keysym, Vx_super_keysym, Vx_toolkit_scroll_bars) (x_mouse_click_focus_ignore_position) (x_underline_at_descent_line) (x_use_underline_position_properties): Remove. * xsmfns.c (syms_of_xsmfns): Update. (Vx_session_id, Vx_session_previous_id): Remove. * xsettings.c (syms_of_xsettings): Update. (Vxft_settings, use_system_font): Remove. * xselect.c (syms_of_xselect): Update. (Vselection_converter_alist, Vx_lost_selection_functions) (Vx_sent_selection_functions, x_selection_timeout): Remove. * xfns.c (syms_of_xfns): Update. (Vgtk_version_string, Vmotif_version_string) (Vx_cursor_fore_pixel, Vx_hourglass_pointer_shape) (Vx_max_tooltip_size, Vx_mode_pointer_shape) (Vx_no_window_manager, Vx_nontext_pointer_shape) (Vx_pixel_size_width_font_regexp, Vx_pointer_shape) (Vx_sensitive_text_pointer_shape) (Vx_window_horizontal_drag_shape, x_gtk_file_dialog_help_text) (x_gtk_show_hidden_files, x_gtk_use_old_file_dialog) (x_gtk_use_system_tooltips, x_gtk_whole_detached_tool_bar): Remove. * xfaces.c (syms_of_xfaces): Update. (Vface_default_stipple, Vface_font_rescale_alist) (Vface_ignored_fonts, Vface_new_frame_defaults) (Vface_remapping_alist, Vfont_list_limit) (Vscalable_fonts_allowed, Vtty_defined_color_alist): Remove. * xdisp.c (syms_of_xdisp): Update. (Vauto_resize_tool_bars, Vblink_cursor_alist) (Vdisplay_pixels_per_inch, Vfontification_functions) (Vframe_title_format, Vglobal_mode_string) (Vglyphless_char_display, Vhourglass_delay, Vhscroll_step) (Vicon_title_format, Vinhibit_redisplay) (Vline_number_display_limit, Vline_prefix) (Vmax_mini_window_height, Vmenu_bar_update_hook) (Vmenu_updating_frame, Vmessage_log_max) (Vmouse_autoselect_window, Vnobreak_char_display) (Voverlay_arrow_position, Voverlay_arrow_string) (Voverlay_arrow_variable_list, Vredisplay_end_trigger_functions) (Vresize_mini_windows, Vshow_trailing_whitespace) (Vtool_bar_border, Vtool_bar_button_margin, Vtool_bar_style) (Vtruncate_partial_width_windows, Vvoid_text_area_pointer) (Vwindow_scroll_functions, Vwindow_size_change_functions) (Vwindow_text_change_functions, Vwrap_prefix) (auto_raise_tool_bar_buttons_p, automatic_hscrolling_p) (debug_end_pos, display_hourglass_p, emacs_scroll_step) (highlight_nonselected_windows, hscroll_margin) (inhibit_eval_during_redisplay, inhibit_free_realized_faces) (inhibit_menubar_update, inhibit_try_cursor_movement) (inhibit_try_window_id, inhibit_try_window_reusing) (line_number_display_limit_width) (make_cursor_line_fully_visible_p, message_truncate_lines) (mode_line_inverse_video, multiple_frames, overline_margin) (scroll_conservatively, scroll_margin, tool_bar_button_relief) (tool_bar_max_label_size, underline_minimum_offset) (unibyte_display_via_language_environment, x_stretch_cursor_p): Remove. * window.c (syms_of_window): Update. (Vminibuf_scroll_window, Vother_window_scroll_buffer) (Vrecenter_redisplay, Vscroll_preserve_screen_position) (Vtemp_buffer_show_function, Vwindow_configuration_change_hook) (Vwindow_point_insertion_type, auto_window_vscroll_p) (mode_line_in_non_selected_windows, next_screen_context_lines) (window_min_height, window_min_width): Remove. (scroll_margin): Remove declaration. * w32term.c (syms_of_w32term): Update. (Vw32_capslock_is_shiftlock, Vw32_grab_focus_on_raise) (Vw32_recognize_altgr, Vw32_swap_mouse_buttons) (Vx_toolkit_scroll_bars, w32_num_mouse_buttons) (w32_use_visible_system_caret, x_underline_at_descent_line) (x_use_underline_position_properties): Remove. (Vcommand_line_args, Vsystem_name, extra_keyboard_modifiers): Remove declaration. * w32select.c (syms_of_w32select): Update. (Vnext_selection_coding_system, Vselection_coding_system): Remove. * w32proc.c (syms_of_ntproc): Update. (Vw32_downcase_file_names, Vw32_generate_fake_inodes) (Vw32_get_true_file_attributes, Vw32_quote_process_args) (Vw32_start_process_inherit_error_mode) (Vw32_start_process_share_console) (Vw32_start_process_show_window, w32_pipe_read_delay): Remove. (Vsystem_name): Remove declaration. * w32font.c (syms_of_w32font): Update. (Vw32_charset_info_alist): Remove. * w32fns.c (globals_of_w32fns, syms_of_w32fns): Update. (Vw32_alt_is_meta, Vw32_apps_modifier, Vw32_bdf_filename_alist) (Vw32_color_map, Vw32_enable_caps_lock, Vw32_enable_num_lock) (Vw32_enable_palette, Vw32_lwindow_modifier) (Vw32_pass_alt_to_system, Vw32_pass_lwindow_to_system) (Vw32_pass_rwindow_to_system, Vw32_phantom_key_code) (Vw32_rwindow_modifier, Vw32_scroll_lock_modifier) (Vx_cursor_fore_pixel, Vx_hourglass_pointer_shape) (Vx_max_tooltip_size, Vx_mode_pointer_shape) (Vx_no_window_manager, Vx_nontext_pointer_shape) (Vx_pixel_size_width_font_regexp, Vx_pointer_shape) (Vx_sensitive_text_pointer_shape) (Vx_window_horizontal_drag_shape, w32_ansi_code_page) (w32_enable_synthesized_fonts, w32_mouse_button_tolerance) (w32_mouse_move_interval) (w32_pass_extra_mouse_buttons_to_system) (w32_pass_multimedia_buttons_to_system, w32_quit_key) (w32_strict_fontnames, w32_strict_painting): Remove. (Vhourglass_delay, Vmenu_bar_mode, Vtool_bar_mode) (Vw32_recognize_altgr, Vwindow_system_version) (w32_num_mouse_buttons, w32_use_visible_system_caret): Remove declaration. * w32console.c (syms_of_ntterm): Update. (w32_use_full_screen_buffer): Remove. (Vtty_defined_color_alist): Remove declaration. * w16select.c (syms_of_win16select): Update. (Vnext_selection_coding_system, Vselection_coding_system): Remove. * undo.c (syms_of_undo): Update. (Vundo_outer_limit, Vundo_outer_limit_function) (undo_inhibit_record_point, undo_limit, undo_strong_limit): Remove. * textprop.c (syms_of_textprop): Update. (Vchar_property_alias_alist, Vdefault_text_properties) (Vinhibit_point_motion_hooks, Vtext_property_default_nonsticky): Remove. * terminal.c (syms_of_terminal): Update. (Vdelete_terminal_functions, Vring_bell_function): Remove. * term.c (syms_of_term): Update. (Vresume_tty_functions, Vsuspend_tty_functions) (no_redraw_on_reenter, system_uses_terminfo, visible_cursor): Remove. * syntax.c (syms_of_syntax): Update. (Vfind_word_boundary_function_table, multibyte_syntax_as_symbol) (open_paren_in_column_0_is_defun_start) (parse_sexp_ignore_comments, parse_sexp_lookup_properties) (words_include_escapes): Remove. * search.c (syms_of_search): Update. (Vinhibit_changing_match_data, Vsearch_spaces_regexp): Remove. * process.c (syms_of_process): Update. (Vprocess_adaptive_read_buffering, Vprocess_connection_type) (delete_exited_processes): Remove. * print.c (syms_of_print): Update. (Vfloat_output_format, Vprint_charset_text_property) (Vprint_circle, Vprint_continuous_numbering, Vprint_gensym) (Vprint_length, Vprint_level, Vprint_number_table) (Vstandard_output, print_escape_multibyte) (print_escape_newlines, print_escape_nonascii, print_quoted): Remove. * msdos.c (syms_of_msdos): Update. (Vdos_unsupported_char_glyph): Remove. (unibyte_display_via_language_environment): Remove declaration. * minibuf.c (syms_of_minibuf): Update. (Vcompletion_regexp_list, Vhistory_add_new_input) (Vhistory_length, Vminibuffer_completing_file_name) (Vminibuffer_completion_confirm) (Vminibuffer_completion_predicate, Vminibuffer_completion_table) (Vminibuffer_exit_hook, Vminibuffer_help_form) (Vminibuffer_history_position, Vminibuffer_history_variable) (Vminibuffer_prompt_properties, Vminibuffer_setup_hook) (Vread_buffer_function, Vread_expression_map) (completion_ignore_case, enable_recursive_minibuffers) (history_delete_duplicates, minibuffer_allow_text_properties) (minibuffer_auto_raise, read_buffer_completion_ignore_case): Remove. * marker.c (syms_of_marker): Update. (byte_debug_flag): Remove. * macros.c (syms_of_macros): Update. (Vexecuting_kbd_macro, executing_kbd_macro_index): Remove. * lread.c (syms_of_lread): Update. (Vafter_load_alist, Vbyte_boolean_vars) (Vbytecomp_version_regexp, Vcurrent_load_list) (Veval_buffer_list, Vload_file_name, Vload_file_rep_suffixes) (Vload_history, Vload_path, Vload_read_function) (Vload_source_file_function, Vload_suffixes, Vobarray) (Vold_style_backquotes, Vpreloaded_file_list, Vread_circle) (Vread_symbol_positions_list, Vread_with_symbol_positions) (Vsource_directory, Vstandard_input, Vuser_init_file, Vvalues) (force_load_messages, load_convert_to_unibyte) (load_dangerous_libraries, load_force_doc_strings) (load_in_progress): Remove. * keymap.c (syms_of_keymap): Update. (Vdefine_key_rebound_commands, Vemulation_mode_map_alists) (Vminibuffer_local_completion_map) (Vminibuffer_local_filename_completion_map) (Vminibuffer_local_filename_must_match_map) (Vminibuffer_local_map, Vminibuffer_local_must_match_map) (Vminibuffer_local_ns_map, Vminor_mode_map_alist) (Vminor_mode_overriding_map_alist, Vwhere_is_preferred_modifier): Remove. * keyboard.c (syms_of_keyboard): Update. (Vauto_save_timeout, Vcommand_error_function) (Vcommand_hook_internal, Vdeactivate_mark) (Vdeferred_action_function, Vdeferred_action_list) (Vdisable_point_adjustment, Vdouble_click_time) (Vecho_keystrokes, Venable_disabled_menus_and_buttons) (Vfunction_key_map, Vglobal_disable_point_adjustment) (Vhelp_char, Vhelp_event_list, Vhelp_form) (Vinput_method_function, Vinput_method_previous_message) (Vkey_translation_map, Vlast_event_frame) (Vlucid_menu_bar_dirty_flag, Vmenu_bar_final_items) (Vminibuffer_message_timeout, Voverriding_local_map) (Voverriding_local_map_menu_flag, Vpost_command_hook) (Vpre_command_hook, Vprefix_help_command) (Vsaved_region_selection, Vselect_active_regions) (Vshow_help_function, Vspecial_event_map, Vsuggest_key_bindings) (Vthis_command, Vthis_command_keys_shift_translated) (Vthis_original_command, Vthrow_on_input, Vtimer_idle_list) (Vtimer_list, Vtool_bar_separator_image_expression, Vtop_level) (Vtty_erase_char, Vunread_command_events) (Vunread_input_method_events, Vunread_post_input_method_events) (auto_save_interval, cannot_suspend, do_mouse_tracking) (double_click_fuzz, extra_keyboard_modifiers) (inhibit_local_menu_bar_menus, last_command_event) (last_input_event, last_nonmenu_event, menu_prompt_more_char) (menu_prompting, meta_prefix_char, num_input_keys) (num_nonmacro_input_events, polling_period, unread_command_char): Remove. * insdel.c (syms_of_insdel): Update. (Vcombine_after_change_calls, check_markers_debug_flag): Remove. * indent.c (syms_of_indent): Update. (indent_tabs_mode): Remove. * image.c (syms_of_image): Update. (Vimage_cache_eviction_delay, Vimage_types) (Vimagemagick_render_type, Vmax_image_size, Vx_bitmap_file_path) (cross_disabled_images): Remove. * fringe.c (syms_of_fringe): Update. (Vfringe_bitmaps, Voverflow_newline_into_fringe): Remove. * frame.c (syms_of_frame): Update. (Vdefault_frame_alist, Vdefault_frame_scroll_bars) (Vdelete_frame_functions, Vframe_alpha_lower_limit) (Vmake_pointer_invisible, Vmenu_bar_mode, Vmouse_highlight) (Vmouse_position_function, Vterminal_frame, Vtool_bar_mode) (Vx_resource_class, Vx_resource_name, focus_follows_mouse): Remove. * fontset.c (syms_of_fontset): Update. (Valternate_fontname_alist, Vfont_encoding_charset_alist) (Vfontset_alias_alist, Vignore_relative_composition) (Votf_script_alist, Vuse_default_ascent) (Vvertical_centering_font_regexp): Remove. * font.c (syms_of_font): Update. (Vfont_encoding_alist, Vfont_log, Vfont_slant_table) (Vfont_weight_table, Vfont_width_table): Remove. * fns.c (syms_of_fns): Update. (Vfeatures, use_dialog_box, use_file_dialog): Remove. * filelock.c (syms_of_filelock): Update. (Vtemporary_file_directory): Remove. * fileio.c (syms_of_fileio): Update. (Vafter_insert_file_functions, Vauto_save_include_big_deletions) (Vauto_save_list_file_name, Vauto_save_visited_file_name) (Vdefault_file_name_coding_system, Vfile_name_coding_system) (Vfile_name_handler_alist, Vinhibit_file_name_handlers) (Vinhibit_file_name_operation, Vset_auto_coding_function) (Vwrite_region_annotate_functions) (Vwrite_region_annotations_so_far) (Vwrite_region_post_annotation_function) (delete_by_moving_to_trash, write_region_inhibit_fsync): Remove. (Vw32_get_true_file_attributes): Remove declaration. * eval.c (syms_of_eval): Update. (Vdebug_ignored_errors, Vdebug_on_error, Vdebug_on_signal) (Vdebugger, Vinhibit_quit, Vmacro_declaration_function) (Vquit_flag, Vsignal_hook_function, Vstack_trace_on_error) (debug_on_next_call, debug_on_quit, debugger_may_continue) (max_lisp_eval_depth, max_specpdl_size): Remove. * emacs.c (syms_of_emacs): Update. (Vafter_init_time, Vbefore_init_time, Vcommand_line_args) (Vdynamic_library_alist, Vemacs_copyright, Vemacs_version) (Vinstallation_directory, Vinvocation_directory) (Vinvocation_name, Vkill_emacs_hook, Vpath_separator) (Vprevious_system_messages_locale, Vprevious_system_time_locale) (Vsystem_configuration, Vsystem_configuration_options) (Vsystem_messages_locale, Vsystem_time_locale, Vsystem_type) (inhibit_x_resources, noninteractive1): Remove. * editfns.c (syms_of_editfns): Update. (Vbuffer_access_fontified_property) (Vbuffer_access_fontify_functions, Vinhibit_field_text_motion) (Voperating_system_release, Vsystem_name, Vuser_full_name) (Vuser_login_name, Vuser_real_login_name): Remove. * dosfns.c (syms_of_dosfns): Update. (Vdos_display_scancodes, Vdos_version, Vdos_windows_version) (dos_codepage, dos_country_code, dos_decimal_point) (dos_hyper_key, dos_keyboard_layout, dos_keypad_mode) (dos_super_key, dos_timezone_offset): Remove. * doc.c (syms_of_doc): Update. (Vbuild_files, Vdoc_file_name): Remove. * dispnew.c (syms_of_display): Update. (Vglyph_table, Vinitial_window_system) (Vredisplay_preemption_period, Vstandard_display_table) (Vwindow_system_version, baud_rate, cursor_in_echo_area) (inverse_video, redisplay_dont_pause, visible_bell): Remove. * dired.c (syms_of_dired): Update. (Vcompletion_ignored_extensions): Remove. (Vw32_get_true_file_attributes): Remove declaration. * dbusbind.c (syms_of_dbusbind): Update. (Vdbus_debug, Vdbus_registered_buses) (Vdbus_registered_objects_table): Remove. * data.c (syms_of_data): Update. (Vmost_negative_fixnum, Vmost_positive_fixnum): Remove. * composite.c (syms_of_composite): Update. (Vauto_composition_function, Vauto_composition_mode) (Vcompose_chars_after_function, Vcomposition_function_table): Remove. * coding.c (syms_of_coding): Update. (Vcharset_revision_table, Vcoding_category_list) (Vcoding_system_alist, Vcoding_system_for_read) (Vcoding_system_for_write, Vcoding_system_list) (Vdefault_process_coding_system, Venable_character_translation) (Vfile_coding_system_alist, Vlast_code_conversion_error) (Vlast_coding_system_used, Vlatin_extra_code_table) (Vlocale_coding_system, Vnetwork_coding_system_alist) (Vprocess_coding_system_alist) (Vselect_safe_coding_system_function) (Vstandard_translation_table_for_decode) (Vstandard_translation_table_for_encode) (Vtranslation_table_for_input, coding_system_require_warning) (eol_mnemonic_dos, eol_mnemonic_mac, eol_mnemonic_undecided) (eol_mnemonic_unix, inherit_process_coding_system) (inhibit_eol_conversion, inhibit_iso_escape_detection) (inhibit_null_byte_detection): Remove. * cmds.c (syms_of_cmds): Update. (Vpost_self_insert_hook): Remove. * charset.c (syms_of_charset): Update. (Vcharset_list, Vcharset_map_path, Vcurrent_iso639_language) (inhibit_load_charset_map): Remove. * character.c (syms_of_character): Update. (Vauto_fill_chars, Vchar_direction_table, Vchar_script_table) (Vchar_width_table, Vprintable_chars) (Vscript_representative_chars, Vtranslation_table_vector) (Vunicode_category_table): Remove. * ccl.c (syms_of_ccl): Update. (Vcode_conversion_map_vector, Vfont_ccl_encoder_alist) (Vtranslation_hash_table_vector): Remove. * category.c (syms_of_category): Update. (Vword_combining_categories, Vword_separating_categories): Remove. * callproc.c (syms_of_callproc): Update. (Vconfigure_info_directory, Vdata_directory, Vdoc_directory) (Vexec_directory, Vexec_path, Vexec_suffixes) (Vinitial_environment, Vprocess_environment) (Vshared_game_score_directory, Vshell_file_name): Remove. * callint.c (syms_of_callint): Update. (Vcommand_debug_status, Vcommand_history, Vcurrent_prefix_arg) (Vmark_even_if_inactive, Vmouse_leave_buffer_hook): Remove. * bytecode.c (syms_of_bytecode): Update. (Vbyte_code_meter, byte_metering_on): Remove. * buffer.c (syms_of_buffer): Update. (Vafter_change_functions, Vbefore_change_functions) (Vchange_major_mode_hook, Vfirst_change_hook) (Vinhibit_read_only, Vkill_buffer_query_functions) (Vtransient_mark_mode, inhibit_modification_hooks): Remove. * alloc.c (syms_of_alloc): Update. (Vgc_cons_percentage, Vgc_elapsed, Vmemory_full) (Vmemory_signal_data, Vpost_gc_hook, Vpurify_flag) (cons_cells_consed, floats_consed, garbage_collection_messages) (gc_cons_threshold, gcs_done, intervals_consed) (misc_objects_consed, pure_bytes_used, string_chars_consed) (strings_consed, symbols_consed, vector_cells_consed): Remove. * lisp.h (DEFVAR_LISP, DEFVAR_LISP_NOPRO, DEFVAR_BOOL) (DEFVAR_INT): Assume global is in `globals'. * alloc.c (globals): Define.
author Tom Tromey <tromey@redhat.com>
date Tue, 18 Jan 2011 13:45:37 -0700
parents ef719132ddfa
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1 /* Composite sequence support.
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67658
diff changeset
2 Copyright (C) 2001, 2002, 2003, 2004, 2005,
112218
376148b31b5e Add 2011 to FSF/AIST copyright years.
Glenn Morris <rgm@gnu.org>
parents: 108361
diff changeset
3 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
376148b31b5e Add 2011 to FSF/AIST copyright years.
Glenn Morris <rgm@gnu.org>
parents: 108361
diff changeset
4 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
67658
547f2b420666 Copyright fixed
Kenichi Handa <handa@m17n.org>
parents: 65487
diff changeset
5 National Institute of Advanced Industrial Science and Technology (AIST)
547f2b420666 Copyright fixed
Kenichi Handa <handa@m17n.org>
parents: 65487
diff changeset
6 Registration Number H14PRO021
90405
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
7 Copyright (C) 2003, 2006
88366
97f11940f06a Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents: 41001
diff changeset
8 National Institute of Advanced Industrial Science and Technology (AIST)
97f11940f06a Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents: 41001
diff changeset
9 Registration Number H13PRO009
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
11 This file is part of GNU Emacs.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
12
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94922
diff changeset
13 GNU Emacs is free software: you can redistribute it and/or modify
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
14 it under the terms of the GNU General Public License as published by
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94922
diff changeset
15 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94922
diff changeset
16 (at your option) any later version.
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
17
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
18 GNU Emacs is distributed in the hope that it will be useful,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21 GNU General Public License for more details.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
22
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
23 You should have received a copy of the GNU General Public License
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94922
diff changeset
24 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
25
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
26 #include <config.h>
105669
68dd71358159 * alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 102726
diff changeset
27 #include <setjmp.h>
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28 #include "lisp.h"
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29 #include "buffer.h"
88366
97f11940f06a Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents: 41001
diff changeset
30 #include "character.h"
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
31 #include "coding.h"
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 #include "intervals.h"
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
33 #include "window.h"
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
34 #include "frame.h"
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
35 #include "dispextern.h"
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
36 #include "font.h"
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
37 #include "termhooks.h"
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
38
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 /* Emacs uses special text property `composition' to support character
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41 composition. A sequence of characters that have the same (i.e. eq)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
42 `composition' property value is treated as a single composite
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
43 sequence (we call it just `composition' here after). Characters in
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
44 a composition are all composed somehow on the screen.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46 The property value has this form when the composition is made:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
47 ((LENGTH . COMPONENTS) . MODIFICATION-FUNC)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 then turns to this form:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50 when the composition is registered in composition_hash_table and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 composition_table. These rather peculiar structures were designed
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
52 to make it easy to distinguish them quickly (we can do that by
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53 checking only the first element) and to extract LENGTH (from the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54 former form) and COMPOSITION-ID (from the latter form).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56 We register a composition when it is displayed, or when the width
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57 is required (for instance, to calculate columns).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 LENGTH -- Length of the composition. This information is used to
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60 check the validity of the composition.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62 COMPONENTS -- Character, string, vector, list, or nil.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
63
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
64 If it is nil, characters in the text are composed relatively
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
65 according to their metrics in font glyphs.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67 If it is a character or a string, the character or characters
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 in the string are composed relatively.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 If it is a vector or list of integers, the element is a
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 character or an encoded composition rule. The characters are
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 composed according to the rules. (2N)th elements are
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 characters to be composed and (2N+1)th elements are
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 composition rules to tell how to compose (2N+2)th element with
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 the previously composed 2N glyphs.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
76
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
77 COMPONENTS-VEC -- Vector of integers. In a relative composition,
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
78 the elements are the characters to be composed. In a rule-base
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 composition, the elements are characters or encoded
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
80 composition rules.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
81
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82 MODIFICATION-FUNC -- If non nil, it is a function to call when the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83 composition gets invalid after a modification in a buffer. If
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 it is nil, a function in `composition-function-table' of the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 first character in the sequence is called.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 COMPOSITION-ID --Identification number of the composition. It is
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 used as an index to composition_table for the composition.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 When Emacs has to display a composition or has to know its
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91 displaying width, the function get_composition_id is called. It
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
92 returns COMPOSITION-ID so that the caller can access the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 information about the composition through composition_table. If a
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 COMPOSITION-ID has not yet been assigned to the composition,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 get_composition_id checks the validity of `composition' property,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 and, if valid, assigns a new ID, registers the information in
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 composition_hash_table and composition_table, and changes the form
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
98 of the property value. If the property is invalid,
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
99 get_composition_id returns -1 without changing the property value.
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
101 We use two tables to keep the information about composition;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 composition_hash_table and composition_table.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
103
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
104 The former is a hash table whose keys are COMPONENTS-VECs and
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
105 values are the corresponding COMPOSITION-IDs. This hash table is
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
106 weak, but as each key (COMPONENTS-VEC) is also kept as a value of the
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107 `composition' property, it won't be collected as garbage until all
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
108 bits of text that have the same COMPONENTS-VEC are deleted.
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
109
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 The latter is a table of pointers to `struct composition' indexed
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
111 by COMPOSITION-ID. This structure keeps the other information (see
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 composite.h).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 In general, a text property holds information about individual
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115 characters. But, a `composition' property holds information about
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
116 a sequence of characters (in this sense, it is like the `intangible'
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
117 property). That means that we should not share the property value
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
118 in adjacent compositions -- we can't distinguish them if they have the
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119 same property. So, after any changes, we call
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 `update_compositions' and change a property of one of adjacent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121 compositions to a copy of it. This function also runs a proper
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
122 composition modification function to make a composition that gets
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
123 invalid by the change valid again.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
124
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
125 As the value of the `composition' property holds information about a
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
126 specific range of text, the value gets invalid if we change the
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
127 text in the range. We treat the `composition' property as always
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
128 rear-nonsticky (currently by setting default-text-properties to
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
129 (rear-nonsticky (composition))) and we never make properties of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
130 adjacent compositions identical. Thus, any such changes make the
49136
6a4a30f1c2cb (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 48318
diff changeset
131 range just shorter. So, we can check the validity of the `composition'
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
132 property by comparing LENGTH information with the actual length of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133 the composition.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
136
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
137
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138 Lisp_Object Qcomposition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
140 /* Table of pointers to the structure `composition' indexed by
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141 COMPOSITION-ID. This structure is for storing information about
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
142 each composition except for COMPONENTS-VEC. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143 struct composition **composition_table;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
144
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
145 /* The current size of `composition_table'. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
146 static int composition_table_size;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
147
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
148 /* Number of compositions currently made. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
149 int n_compositions;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
150
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
151 /* Hash table for compositions. The key is COMPONENTS-VEC of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
152 `composition' property. The value is the corresponding
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
153 COMPOSITION-ID. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154 Lisp_Object composition_hash_table;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
156 Lisp_Object Qauto_composed;
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
157 Lisp_Object Qauto_composition_function;
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
158 /* Maximum number of characters to look back for
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
159 auto-compositions. */
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
160 #define MAX_AUTO_COMPOSITION_LOOKBACK 3
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
161
89546
c380df3cc4df (Fremove_list_of_text_properties): Declare.
Dave Love <fx@gnu.org>
parents: 89509
diff changeset
162 EXFUN (Fremove_list_of_text_properties, 4);
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
163
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 /* Temporary variable used in macros COMPOSITION_XXX. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 Lisp_Object composition_temp;
90405
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
166
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 /* Return COMPOSITION-ID of a composition at buffer position
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169 CHARPOS/BYTEPOS and length NCHARS. The `composition' property of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
170 the sequence is PROP. STRING, if non-nil, is a string that
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171 contains the composition instead of the current buffer.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 If the composition is invalid, return -1. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 int
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
176 get_composition_id (EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT nchars,
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
177 Lisp_Object prop, Lisp_Object string)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
178 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 Lisp_Object id, length, components, key, *key_contents;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 int glyph_len;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (composition_hash_table);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182 int hash_index;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 unsigned hash_code;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
184 struct composition *cmp;
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
185 EMACS_INT i;
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
186 int ch;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
187
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
188 /* PROP should be
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
189 Form-A: ((LENGTH . COMPONENTS) . MODIFICATION-FUNC)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
190 or
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 Form-B: (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192 */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193 if (nchars == 0 || !CONSP (prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
194 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
195
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
196 id = XCAR (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
197 if (INTEGERP (id))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
199 /* PROP should be Form-B. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200 if (XINT (id) < 0 || XINT (id) >= n_compositions)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
201 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
202 return XINT (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205 /* PROP should be Form-A.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
206 Thus, ID should be (LENGTH . COMPONENTS). */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
207 if (!CONSP (id))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
208 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
209 length = XCAR (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
210 if (!INTEGERP (length) || XINT (length) != nchars)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
211 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
212
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
213 components = XCDR (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
214
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215 /* Check if the same composition has already been registered or not
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
216 by consulting composition_hash_table. The key for this table is
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
217 COMPONENTS (converted to a vector COMPONENTS-VEC) or, if it is
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
218 nil, vector of characters in the composition range. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
219 if (INTEGERP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
220 key = Fmake_vector (make_number (1), components);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
221 else if (STRINGP (components) || CONSP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
222 key = Fvconcat (1, &components);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
223 else if (VECTORP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
224 key = components;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
225 else if (NILP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
226 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227 key = Fmake_vector (make_number (nchars), Qnil);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
228 if (STRINGP (string))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
229 for (i = 0; i < nchars; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
230 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
231 FETCH_STRING_CHAR_ADVANCE (ch, string, charpos, bytepos);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232 XVECTOR (key)->contents[i] = make_number (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
233 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
234 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
235 for (i = 0; i < nchars; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
236 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
237 FETCH_CHAR_ADVANCE (ch, charpos, bytepos);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
238 XVECTOR (key)->contents[i] = make_number (ch);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
239 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
240 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
241 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
242 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
243
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
244 hash_index = hash_lookup (hash_table, key, &hash_code);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
245 if (hash_index >= 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
246 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
247 /* We have already registered the same composition. Change PROP
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
248 from Form-A above to Form-B while replacing COMPONENTS with
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
249 COMPONENTS-VEC stored in the hash table. We can directly
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
250 modify the cons cell of PROP because it is not shared. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
251 key = HASH_KEY (hash_table, hash_index);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
252 id = HASH_VALUE (hash_table, hash_index);
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
253 XSETCAR (prop, id);
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
254 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop))));
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
255 return XINT (id);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
256 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
257
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
258 /* This composition is a new one. We must register it. */
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
259
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
260 /* Check if we have sufficient memory to store this information. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
261 if (composition_table_size == 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
262 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
263 composition_table_size = 256;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
264 composition_table
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
265 = (struct composition **) xmalloc (sizeof (composition_table[0])
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
266 * composition_table_size);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
267 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
268 else if (composition_table_size <= n_compositions)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
269 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
270 composition_table_size += 256;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
271 composition_table
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
272 = (struct composition **) xrealloc (composition_table,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
273 sizeof (composition_table[0])
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
274 * composition_table_size);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
275 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
276
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277 key_contents = XVECTOR (key)->contents;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
278
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
279 /* Check if the contents of COMPONENTS are valid if COMPONENTS is a
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
280 vector or a list. It should be a sequence of:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
281 char1 rule1 char2 rule2 char3 ... ruleN charN+1 */
90405
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
282
94922
181a3677061e Throughout the file, delete all USE_FONT_BACKEND
Kenichi Handa <handa@m17n.org>
parents: 92028
diff changeset
283 if (VECTORP (components)
90405
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
284 && ASIZE (components) >= 2
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
285 && VECTORP (AREF (components, 0)))
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
286 {
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
287 /* COMPONENTS is a glyph-string. */
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
288 EMACS_UINT len = ASIZE (key);
90405
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
289
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
290 for (i = 1; i < len; i++)
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
291 if (! VECTORP (AREF (key, i)))
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
292 goto invalid_composition;
3dc2ea167caf (get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents: 90294
diff changeset
293 }
94922
181a3677061e Throughout the file, delete all USE_FONT_BACKEND
Kenichi Handa <handa@m17n.org>
parents: 92028
diff changeset
294 else if (VECTORP (components) || CONSP (components))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
295 {
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
296 EMACS_UINT len = XVECTOR (key)->size;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
297
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
298 /* The number of elements should be odd. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299 if ((len % 2) == 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
300 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301 /* All elements should be integers (character or encoded
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
302 composition rule). */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
303 for (i = 0; i < len; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
304 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
305 if (!INTEGERP (key_contents[i]))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
306 goto invalid_composition;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
307 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
308 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
309
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
310 /* Change PROP from Form-A above to Form-B. We can directly modify
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
311 the cons cell of PROP because it is not shared. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
312 XSETFASTINT (id, n_compositions);
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
313 XSETCAR (prop, id);
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
314 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop))));
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
315
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
316 /* Register the composition in composition_hash_table. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
317 hash_index = hash_put (hash_table, key, id, hash_code);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
318
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
319 /* Register the composition in composition_table. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
320 cmp = (struct composition *) xmalloc (sizeof (struct composition));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
321
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
322 cmp->method = (NILP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
323 ? COMPOSITION_RELATIVE
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
324 : ((INTEGERP (components) || STRINGP (components))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
325 ? COMPOSITION_WITH_ALTCHARS
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
326 : COMPOSITION_WITH_RULE_ALTCHARS));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
327 cmp->hash_index = hash_index;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
328 glyph_len = (cmp->method == COMPOSITION_WITH_RULE_ALTCHARS
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
329 ? (XVECTOR (key)->size + 1) / 2
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
330 : XVECTOR (key)->size);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
331 cmp->glyph_len = glyph_len;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
332 cmp->offsets = (short *) xmalloc (sizeof (short) * glyph_len * 2);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
333 cmp->font = NULL;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
334
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
335 if (cmp->method != COMPOSITION_WITH_RULE_ALTCHARS)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
336 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
337 /* Relative composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
338 cmp->width = 0;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
339 for (i = 0; i < glyph_len; i++)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
340 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
341 int this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
342 ch = XINT (key_contents[i]);
96413
b38a7de9af46 (get_composition_id): Fix the width calculation for TAB.
Kenichi Handa <handa@m17n.org>
parents: 94963
diff changeset
343 this_width = (ch == '\t' ? 1 : CHAR_WIDTH (ch));
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
344 if (cmp->width < this_width)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
345 cmp->width = this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
346 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
347 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
348 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
349 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
350 /* Rule-base composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
351 float leftmost = 0.0, rightmost;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
352
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
353 ch = XINT (key_contents[0]);
90618
b7ce72709298 (get_composition_id): Pay attention to TAB
Kenichi Handa <handa@m17n.org>
parents: 90405
diff changeset
354 rightmost = ch != '\t' ? CHAR_WIDTH (ch) : 1;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
355
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
356 for (i = 1; i < glyph_len; i += 2)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
357 {
89726
2660b0974edb (get_composition_id): Handle xoff and yoff in a
Kenichi Handa <handa@m17n.org>
parents: 89706
diff changeset
358 int rule, gref, nref, xoff, yoff;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
359 int this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
360 float this_left;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
361
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
362 rule = XINT (key_contents[i]);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
363 ch = XINT (key_contents[i + 1]);
90618
b7ce72709298 (get_composition_id): Pay attention to TAB
Kenichi Handa <handa@m17n.org>
parents: 90405
diff changeset
364 this_width = ch != '\t' ? CHAR_WIDTH (ch) : 1;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
365
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
366 /* A composition rule is specified by an integer value
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367 that encodes global and new reference points (GREF and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
368 NREF). GREF and NREF are specified by numbers as
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
369 below:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
370 0---1---2 -- ascent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
371 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
372 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
373 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
374 9--10--11 -- center
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
375 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
376 ---3---4---5--- baseline
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
377 | |
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
378 6---7---8 -- descent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
379 */
89726
2660b0974edb (get_composition_id): Handle xoff and yoff in a
Kenichi Handa <handa@m17n.org>
parents: 89706
diff changeset
380 COMPOSITION_DECODE_RULE (rule, gref, nref, xoff, yoff);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
381 this_left = (leftmost
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
382 + (gref % 3) * (rightmost - leftmost) / 2.0
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
383 - (nref % 3) * this_width / 2.0);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
384
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
385 if (this_left < leftmost)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
386 leftmost = this_left;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
387 if (this_left + this_width > rightmost)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
388 rightmost = this_left + this_width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
389 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
390
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
391 cmp->width = rightmost - leftmost;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
392 if (cmp->width < (rightmost - leftmost))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
393 /* To get a ceiling integer value. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
394 cmp->width++;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
395 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
396
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
397 composition_table[n_compositions] = cmp;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
398
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
399 return n_compositions++;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
400
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
401 invalid_composition:
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
402 /* Would it be better to remove this `composition' property? */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
403 return -1;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
404 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
405
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
406
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
407 /* Find a static composition at or nearest to position POS of OBJECT
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
408 (buffer or string).
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
409
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
410 OBJECT defaults to the current buffer. If there's a composition at
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
411 POS, set *START and *END to the start and end of the sequence,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
412 *PROP to the `composition' property, and return 1.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
413
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
414 If there's no composition at POS and LIMIT is negative, return 0.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
415
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
416 Otherwise, search for a composition forward (LIMIT > POS) or
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
417 backward (LIMIT < POS). In this case, LIMIT bounds the search.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
418
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
419 If a composition is found, set *START, *END, and *PROP as above,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
420 and return 1, else return 0.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
421
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
422 This doesn't check the validity of composition. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
423
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
424 int
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
425 find_composition (EMACS_INT pos, EMACS_INT limit,
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
426 EMACS_INT *start, EMACS_INT *end,
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
427 Lisp_Object *prop, Lisp_Object object)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
428 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
429 Lisp_Object val;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
430
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
431 if (get_property_and_range (pos, Qcomposition, prop, start, end, object))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
432 return 1;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
433
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
434 if (limit < 0 || limit == pos)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
435 return 0;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
436
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
437 if (limit > pos) /* search forward */
34933
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
438 {
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
439 val = Fnext_single_property_change (make_number (pos), Qcomposition,
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
440 object, make_number (limit));
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
441 pos = XINT (val);
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
442 if (pos == limit)
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
443 return 0;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
444 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
445 else /* search backward */
34933
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
446 {
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
447 if (get_property_and_range (pos - 1, Qcomposition, prop, start, end,
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
448 object))
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
449 return 1;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
450 val = Fprevious_single_property_change (make_number (pos), Qcomposition,
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
451 object, make_number (limit));
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
452 pos = XINT (val);
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
453 if (pos == limit)
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
454 return 0;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
455 pos--;
414310d24f52 (find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents: 34241
diff changeset
456 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
457 get_property_and_range (pos, Qcomposition, prop, start, end, object);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
458 return 1;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
459 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
460
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
461 /* Run a proper function to adjust the composition sitting between
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
462 FROM and TO with property PROP. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
463
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
464 static void
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
465 run_composition_function (EMACS_INT from, EMACS_INT to, Lisp_Object prop)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
466 {
34958
e3133339e30c (run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents: 34933
diff changeset
467 Lisp_Object func;
89509
3c9d2f9bf6bb (find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
468 EMACS_INT start, end;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
469
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
470 func = COMPOSITION_MODIFICATION_FUNC (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
471 /* If an invalid composition precedes or follows, try to make them
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
472 valid too. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
473 if (from > BEGV
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
474 && find_composition (from - 1, -1, &start, &end, &prop, Qnil)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
475 && !COMPOSITION_VALID_P (start, end, prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
476 from = start;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
477 if (to < ZV
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
478 && find_composition (to, -1, &start, &end, &prop, Qnil)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
479 && !COMPOSITION_VALID_P (start, end, prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
480 to = end;
46940
545e543e82d5 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 46938
diff changeset
481 if (!NILP (Ffboundp (func)))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
482 call2 (func, make_number (from), make_number (to));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
483 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
484
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
485 /* Make invalid compositions adjacent to or inside FROM and TO valid.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
486 CHECK_MASK is bitwise `or' of mask bits defined by macros
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487 CHECK_XXX (see the comment in composite.h).
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
488
89361
1dd4e6b8509a (syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents: 89340
diff changeset
489 It also resets the text-property `auto-composed' to a proper region
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
490 so that automatic character composition works correctly later while
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
491 displaying the region.
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 88123 89361
diff changeset
492
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
493 This function is called when a buffer text is changed. If the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
494 change is deletion, FROM == TO. Otherwise, FROM < TO. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
495
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
497 update_compositions (EMACS_INT from, EMACS_INT to, int check_mask)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
498 {
34958
e3133339e30c (run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents: 34933
diff changeset
499 Lisp_Object prop;
89509
3c9d2f9bf6bb (find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
500 EMACS_INT start, end;
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
501 /* The beginning and end of the region to set the property
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
502 `auto-composed' to nil. */
89509
3c9d2f9bf6bb (find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
503 EMACS_INT min_pos = from, max_pos = to;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
504
39046
a61b3d907098 (update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents: 38116
diff changeset
505 if (inhibit_modification_hooks)
a61b3d907098 (update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents: 38116
diff changeset
506 return;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
507
28581
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
508 /* If FROM and TO are not in a valid range, do nothing. */
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
509 if (! (BEGV <= from && from <= to && to <= ZV))
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
510 return;
151b7ae3b21f (update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents: 28472
diff changeset
511
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
512 if (check_mask & CHECK_HEAD)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
513 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
514 /* FROM should be at composition boundary. But, insertion or
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
515 deletion will make two compositions adjacent and
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
516 indistinguishable when they have same (eq) property. To
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
517 avoid it, in such a case, we change the property of the
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
518 latter to the copy of it. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
519 if (from > BEGV
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
520 && find_composition (from - 1, -1, &start, &end, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
521 && COMPOSITION_VALID_P (start, end, prop))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
522 {
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
523 min_pos = start;
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
524 if (end > to)
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
525 max_pos = end;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
526 if (from < end)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 Fput_text_property (make_number (from), make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
528 Qcomposition,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
529 Fcons (XCAR (prop), XCDR (prop)), Qnil);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
530 run_composition_function (start, end, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
531 from = end;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
532 }
37242
029c8c1b451d (update_compositions) <check_mask & CHECK_HEAD>: Fix
Dave Love <fx@gnu.org>
parents: 34958
diff changeset
533 else if (from < ZV
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
534 && find_composition (from, -1, &start, &from, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
535 && COMPOSITION_VALID_P (start, from, prop))
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
536 {
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
537 if (from > to)
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
538 max_pos = from;
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
539 run_composition_function (start, from, prop);
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
540 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
541 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
542
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
543 if (check_mask & CHECK_INSIDE)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
544 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
545 /* In this case, we are sure that (check & CHECK_TAIL) is also
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
546 nonzero. Thus, here we should check only compositions before
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
547 (to - 1). */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
548 while (from < to - 1
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
549 && find_composition (from, to, &start, &from, &prop, Qnil)
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
550 && COMPOSITION_VALID_P (start, from, prop)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551 && from < to - 1)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
552 run_composition_function (start, from, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
553 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
554
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
555 if (check_mask & CHECK_TAIL)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
556 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
557 if (from < to
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
558 && find_composition (to - 1, -1, &start, &end, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
559 && COMPOSITION_VALID_P (start, end, prop))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
560 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
561 /* TO should be also at composition boundary. But,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
562 insertion or deletion will make two compositions adjacent
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
563 and indistinguishable when they have same (eq) property.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
564 To avoid it, in such a case, we change the property of
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
565 the former to the copy of it. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
566 if (to < end)
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
567 {
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
568 Fput_text_property (make_number (start), make_number (to),
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
569 Qcomposition,
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
570 Fcons (XCAR (prop), XCDR (prop)), Qnil);
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
571 max_pos = end;
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
572 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
573 run_composition_function (start, end, prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
574 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
575 else if (to < ZV
78011
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
576 && find_composition (to, -1, &start, &end, &prop, Qnil)
f6d5dccc38c9 (update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents: 75348
diff changeset
577 && COMPOSITION_VALID_P (start, end, prop))
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
578 {
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
579 run_composition_function (start, end, prop);
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
580 max_pos = end;
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
581 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
582 }
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
583 if (min_pos < max_pos)
89633
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
584 {
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
585 int count = SPECPDL_INDEX ();
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
586
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
587 specbind (Qinhibit_read_only, Qt);
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
588 specbind (Qinhibit_modification_hooks, Qt);
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
589 specbind (Qinhibit_point_motion_hooks, Qt);
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
590 Fremove_list_of_text_properties (make_number (min_pos),
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
591 make_number (max_pos),
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
592 Fcons (Qauto_composed, Qnil), Qnil);
40b05b530518 (update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents: 89546
diff changeset
593 unbind_to (count, Qnil);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
595 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
596
30022
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
597
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
598 /* Modify composition property values in LIST destructively. LIST is
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
599 a list as returned from text_property_list. Change values to the
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
600 top-level copies of them so that none of them are `eq'. */
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
601
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
602 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
603 make_composition_value_copy (Lisp_Object list)
30022
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
604 {
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
605 Lisp_Object plist, val;
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
606
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
607 for (; CONSP (list); list = XCDR (list))
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
608 {
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
609 plist = XCAR (XCDR (XCDR (XCAR (list))));
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
610 while (CONSP (plist) && CONSP (XCDR (plist)))
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
611 {
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
612 if (EQ (XCAR (plist), Qcomposition)
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
613 && (val = XCAR (XCDR (plist)), CONSP (val)))
39973
579177964efa Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents: 39046
diff changeset
614 XSETCAR (XCDR (plist), Fcons (XCAR (val), XCDR (val)));
30022
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
615 plist = XCDR (XCDR (plist));
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
616 }
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
617 }
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
618 }
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
619
6a52904a743b (make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents: 28581
diff changeset
620
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
621 /* Make text in the region between START and END a composition that
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
622 has COMPONENTS and MODIFICATION-FUNC.
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
623
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
624 If STRING is non-nil, then operate on characters contained between
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
625 indices START and END in STRING. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
626
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
627 void
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
628 compose_text (EMACS_INT start, EMACS_INT end, Lisp_Object components,
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
629 Lisp_Object modification_func, Lisp_Object string)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
630 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
631 Lisp_Object prop;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633 prop = Fcons (Fcons (make_number (end - start), components),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 modification_func);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
635 Fput_text_property (make_number (start), make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636 Qcomposition, prop, string);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
637 }
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
638
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
639
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
640 static Lisp_Object autocmp_chars (Lisp_Object, EMACS_INT, EMACS_INT,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
641 EMACS_INT, struct window *,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
642 struct face *, Lisp_Object);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
643
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
644
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
645 /* Lisp glyph-string handlers */
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
646
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
647 /* Hash table for automatic composition. The key is a header of a
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
648 lgstring (Lispy glyph-string), and the value is a body of a
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
649 lgstring. */
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
650
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
651 static Lisp_Object gstring_hash_table;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
652
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
653 static Lisp_Object gstring_lookup_cache (Lisp_Object);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
654
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
655 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
656 gstring_lookup_cache (Lisp_Object header)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
657 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
658 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
659 int i = hash_lookup (h, header, NULL);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
660
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
661 return (i >= 0 ? HASH_VALUE (h, i) : Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
662 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
663
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
664 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
665 composition_gstring_put_cache (Lisp_Object gstring, int len)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
666 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
667 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
668 unsigned hash;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
669 Lisp_Object header, copy;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
670 int i;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
671
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
672 header = LGSTRING_HEADER (gstring);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
673 hash = h->hashfn (h, header);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
674 if (len < 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
675 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
676 len = LGSTRING_GLYPH_LEN (gstring);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
677 for (i = 0; i < len; i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
678 if (NILP (LGSTRING_GLYPH (gstring, i)))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
679 break;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
680 len = i;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
681 }
102726
93ad3a5a4f75 Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 101967
diff changeset
682
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
683 copy = Fmake_vector (make_number (len + 2), Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
684 LGSTRING_SET_HEADER (copy, Fcopy_sequence (header));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
685 for (i = 0; i < len; i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
686 LGSTRING_SET_GLYPH (copy, i, Fcopy_sequence (LGSTRING_GLYPH (gstring, i)));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
687 i = hash_put (h, LGSTRING_HEADER (copy), copy, hash);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
688 LGSTRING_SET_ID (copy, make_number (i));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
689 return copy;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
690 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
691
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
692 Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
693 composition_gstring_from_id (int id)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
694 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
695 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
696
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
697 return HASH_VALUE (h, id);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
698 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
699
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
700 static Lisp_Object fill_gstring_header (Lisp_Object, Lisp_Object,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
701 Lisp_Object, Lisp_Object,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 108881
diff changeset
702 Lisp_Object);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
703
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
704 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
705 composition_gstring_p (Lisp_Object gstring)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
706 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
707 Lisp_Object header;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
708 int i;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
709
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
710 if (! VECTORP (gstring) || ASIZE (gstring) < 2)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
711 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
712 header = LGSTRING_HEADER (gstring);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
713 if (! VECTORP (header) || ASIZE (header) < 2)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
714 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
715 if (! NILP (LGSTRING_FONT (gstring))
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
716 && (! FONT_OBJECT_P (LGSTRING_FONT (gstring))
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
717 && ! CODING_SYSTEM_P (LGSTRING_FONT (gstring))))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
718 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
719 for (i = 1; i < ASIZE (LGSTRING_HEADER (gstring)); i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
720 if (! NATNUMP (AREF (LGSTRING_HEADER (gstring), i)))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
721 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
722 if (! NILP (LGSTRING_ID (gstring)) && ! NATNUMP (LGSTRING_ID (gstring)))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
723 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
724 for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
725 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
726 Lisp_Object glyph = LGSTRING_GLYPH (gstring, i);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
727 if (NILP (glyph))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
728 break;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
729 if (! VECTORP (glyph) || ASIZE (glyph) != LGLYPH_SIZE)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
730 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
731 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
732 return 1;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
733 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
734
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
735 int
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
736 composition_gstring_width (Lisp_Object gstring, EMACS_INT from, EMACS_INT to,
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
737 struct font_metrics *metrics)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
738 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
739 Lisp_Object *glyph;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
740 int width = 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
741
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
742 if (metrics)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
743 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
744 Lisp_Object font_object = LGSTRING_FONT (gstring);
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
745
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
746 if (FONT_OBJECT_P (font_object))
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
747 {
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
748 struct font *font = XFONT_OBJECT (font_object);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
749
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
750 metrics->ascent = font->ascent;
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
751 metrics->descent = font->descent;
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
752 }
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
753 else
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
754 {
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
755 metrics->ascent = 1;
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
756 metrics->descent = 0;
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
757 }
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
758 metrics->width = metrics->lbearing = metrics->rbearing = 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
759 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
760 for (glyph = &LGSTRING_GLYPH (gstring, from); from < to; from++, glyph++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
761 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
762 int x;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
763
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
764 if (NILP (LGLYPH_ADJUSTMENT (*glyph)))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
765 width += LGLYPH_WIDTH (*glyph);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
766 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
767 width += LGLYPH_WADJUST (*glyph);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
768 if (metrics)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
769 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
770 x = metrics->width + LGLYPH_LBEARING (*glyph) + LGLYPH_XOFF (*glyph);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
771 if (metrics->lbearing > x)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
772 metrics->lbearing = x;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
773 x = metrics->width + LGLYPH_RBEARING (*glyph) + LGLYPH_XOFF (*glyph);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
774 if (metrics->rbearing < x)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
775 metrics->rbearing = x;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
776 metrics->width = width;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
777 x = LGLYPH_ASCENT (*glyph) - LGLYPH_YOFF (*glyph);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
778 if (metrics->ascent < x)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
779 metrics->ascent = x;
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
780 x = LGLYPH_DESCENT (*glyph) + LGLYPH_YOFF (*glyph);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
781 if (metrics->descent < x)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
782 metrics->descent = x;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
783 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
784 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
785 return width;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
786 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
787
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
788
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
789 static Lisp_Object gstring_work;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
790 static Lisp_Object gstring_work_headers;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
791
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
792 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
793 fill_gstring_header (Lisp_Object header, Lisp_Object start, Lisp_Object end, Lisp_Object font_object, Lisp_Object string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
794 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
795 EMACS_INT from, to, from_byte;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
796 EMACS_INT len, i;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
797
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
798 if (NILP (string))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
799 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
800 if (NILP (current_buffer->enable_multibyte_characters))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
801 error ("Attempt to shape unibyte text");
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
802 validate_region (&start, &end);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
803 from = XFASTINT (start);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
804 to = XFASTINT (end);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
805 from_byte = CHAR_TO_BYTE (from);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
806 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
807 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
808 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
809 CHECK_STRING (string);
99301
ef372a9c4197 (fill_gstring_header): Fix copy/paste typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 98369
diff changeset
810 if (! STRING_MULTIBYTE (string))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
811 error ("Attempt to shape unibyte text");
98214
5803b1114219 (fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents: 98213
diff changeset
812 /* FROM and TO are checked by the caller. */
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
813 from = XINT (start);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
814 to = XINT (end);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
815 if (from < 0 || from > to || to > SCHARS (string))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
816 args_out_of_range_3 (string, start, end);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
817 from_byte = string_char_to_byte (string, from);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
818 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
820 len = to - from;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
821 if (len == 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
822 error ("Attempt to shape zero-length text");
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
823 if (VECTORP (header))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
824 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
825 if (ASIZE (header) != len + 1)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
826 args_out_of_range (header, make_number (len + 1));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
827 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
828 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
829 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
830 if (len <= 8)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
831 header = AREF (gstring_work_headers, len - 1);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
832 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
833 header = Fmake_vector (make_number (len + 1), Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
834 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
835
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
836 ASET (header, 0, font_object);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
837 for (i = 0; i < len; i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
838 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
839 int c;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
840
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
841 if (NILP (string))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
842 FETCH_CHAR_ADVANCE_NO_CHECK (c, from, from_byte);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
843 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
844 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, from, from_byte);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
845 ASET (header, i + 1, make_number (c));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
846 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
847 return header;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
848 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
849
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
850 static void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
851 fill_gstring_body (Lisp_Object gstring)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
852 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
853 Lisp_Object font_object = LGSTRING_FONT (gstring);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
854 Lisp_Object header = AREF (gstring, 0);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
855 EMACS_INT len = LGSTRING_CHAR_LEN (gstring);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
856 EMACS_INT i;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
857
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
858 for (i = 0; i < len; i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
859 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
860 Lisp_Object g = LGSTRING_GLYPH (gstring, i);
97854
a361f652d863 (fill_gstring_body): Avoid compiler warnings.
Eli Zaretskii <eliz@gnu.org>
parents: 97819
diff changeset
861 EMACS_INT c = XINT (AREF (header, i + 1));
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
862
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
863 if (NILP (g))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
864 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
865 g = LGLYPH_NEW ();
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
866 LGSTRING_SET_GLYPH (gstring, i, g);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
867 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
868 LGLYPH_SET_FROM (g, i);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
869 LGLYPH_SET_TO (g, i);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
870 LGLYPH_SET_CHAR (g, c);
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
871 if (FONT_OBJECT_P (font_object))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
872 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
873 font_fill_lglyph_metrics (g, font_object);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
874 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
875 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
876 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
877 int width = XFASTINT (CHAR_TABLE_REF (Vchar_width_table, c));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
878
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
879 LGLYPH_SET_CODE (g, c);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
880 LGLYPH_SET_LBEARING (g, 0);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
881 LGLYPH_SET_RBEARING (g, width);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
882 LGLYPH_SET_WIDTH (g, width);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
883 LGLYPH_SET_ASCENT (g, 1);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
884 LGLYPH_SET_DESCENT (g, 0);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
885 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
886 LGLYPH_SET_ADJUSTMENT (g, Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
887 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
888 if (i < LGSTRING_GLYPH_LEN (gstring))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
889 LGSTRING_SET_GLYPH (gstring, i, Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
890 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
891
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
892
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
893 /* Try to compose the characters at CHARPOS according to composition
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
894 rule RULE ([PATTERN PREV-CHARS FUNC]). LIMIT limits the characters
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
895 to compose. STRING, if not nil, is a target string. WIN is a
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
896 window where the characters are being displayed. If characters are
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
897 successfully composed, return the composition as a glyph-string
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
898 object. Otherwise return nil. */
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
899
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
900 static Lisp_Object
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
901 autocmp_chars (Lisp_Object rule, EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT limit, struct window *win, struct face *face, Lisp_Object string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
902 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
903 int count = SPECPDL_INDEX ();
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
904 FRAME_PTR f = XFRAME (win->frame);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
905 Lisp_Object pos = make_number (charpos);
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
906 EMACS_INT to;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
907 EMACS_INT pt = PT, pt_byte = PT_BYTE;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
908 Lisp_Object re, font_object, lgstring;
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
909 EMACS_INT len;
102726
93ad3a5a4f75 Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 101967
diff changeset
910
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
911 record_unwind_save_match_data ();
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
912 re = AREF (rule, 0);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
913 if (NILP (re))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
914 len = 1;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
915 else if (! STRINGP (re))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
916 return unbind_to (count, Qnil);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
917 else if ((len = fast_looking_at (re, charpos, bytepos, limit, -1, string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
918 > 0)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
919 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
920 if (NILP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
921 len = BYTE_TO_CHAR (bytepos + len) - charpos;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
922 else
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
923 len = string_byte_to_char (string, bytepos + len) - charpos;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
924 }
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
925 if (len <= 0)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
926 return unbind_to (count, Qnil);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
927 to = limit = charpos + len;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
928 #ifdef HAVE_WINDOW_SYSTEM
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
929 if (FRAME_WINDOW_P (f))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
930 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
931 font_object = font_range (charpos, &to, win, face, string);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
932 if (! FONT_OBJECT_P (font_object)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
933 || (! NILP (re)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
934 && to < limit
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
935 && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0)))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
936 return unbind_to (count, Qnil);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
937 }
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
938 else
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
939 #endif /* not HAVE_WINDOW_SYSTEM */
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
940 font_object = win->frame;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
941 lgstring = Fcomposition_get_gstring (pos, make_number (to), font_object,
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
942 string);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
943 if (NILP (LGSTRING_ID (lgstring)))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
944 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
945 Lisp_Object args[6];
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
946
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
947 /* Save point as marker before calling out to lisp. */
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
948 if (NILP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
949 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
950 Lisp_Object m = Fmake_marker ();
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
951 set_marker_both (m, Qnil, pt, pt_byte);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
952 record_unwind_protect (restore_point_unwind, m);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
953 }
108361
c1fe9f79424a Fix for Bug#5984.
Chong Yidong <cyd@stupidchicken.com>
parents: 106822
diff changeset
954
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
955 args[0] = Vauto_composition_function;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
956 args[1] = AREF (rule, 2);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
957 args[2] = pos;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
958 args[3] = make_number (to);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
959 args[4] = font_object;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
960 args[5] = string;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
961 lgstring = safe_call (6, args);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
962 if (NILP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
963 TEMP_SET_PT_BOTH (pt, pt_byte);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
964 }
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
965 return unbind_to (count, lgstring);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
966 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
967
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
968 static Lisp_Object _work_val;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
969 static int _work_char;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
970
109976
26e31bcc4b06 Allow composition striding over PT.
Kenichi Handa <handa@m17n.org>
parents: 109972
diff changeset
971 /* 1 iff the character C is composable. Characters of general
26e31bcc4b06 Allow composition striding over PT.
Kenichi Handa <handa@m17n.org>
parents: 109972
diff changeset
972 category Z? or C? are not composable except for ZWNJ and ZWJ. */
26e31bcc4b06 Allow composition striding over PT.
Kenichi Handa <handa@m17n.org>
parents: 109972
diff changeset
973
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
974 #define CHAR_COMPOSABLE_P(C) \
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
975 ((C) == 0x200C || (C) == 0x200D \
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
976 || (_work_val = CHAR_TABLE_REF (Vunicode_category_table, (C)), \
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
977 (SYMBOLP (_work_val) \
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
978 && (_work_char = SDATA (SYMBOL_NAME (_work_val))[0]) != 'C' \
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
979 && _work_char != 'Z')))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
980
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
981 /* Update cmp_it->stop_pos to the next position after CHARPOS (and
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
982 BYTEPOS) where character composition may happen. If BYTEPOS is
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
983 negative, compute it. ENDPOS is a limit of searching. If it is
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
984 less than CHARPOS, search backward to ENDPOS+1 assuming that
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
985 set_iterator_to_next works in reverse order. In this case, if a
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
986 composition closest to CHARPOS is found, set cmp_it->stop_pos to
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
987 the last character of the composition.
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
988
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
989 If no composition is found, set cmp_it->ch to -2. If a static
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
990 composition is found, set cmp_it->ch to -1. Otherwise, set
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
991 cmp_it->ch to the character that triggers the automatic
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
992 composition. */
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
993
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
994 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
995 composition_compute_stop_pos (struct composition_it *cmp_it, EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT endpos, Lisp_Object string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
996 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
997 EMACS_INT start, end, c;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
998 Lisp_Object prop, val;
98107
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
999 /* This is from forward_to_next_line_start in xdisp.c. */
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1000 const int MAX_NEWLINE_DISTANCE = 500;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1001
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1002 if (charpos < endpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1003 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1004 if (endpos > charpos + MAX_NEWLINE_DISTANCE)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1005 endpos = charpos + MAX_NEWLINE_DISTANCE;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1006 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1007 else if (endpos < charpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1008 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1009 /* We search backward for a position to check composition. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1010 if (endpos < 0)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1011 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1012 /* But we don't know where to stop the searching. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1013 endpos = NILP (string) ? BEGV - 1 : -1;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1014 /* Usually we don't reach ENDPOS because we stop searching
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1015 at an uncomposable character (NL, LRE, etc). */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1016 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1017 }
98128
092123c2b01a (composition_compute_stop_pos): Reset cmp_it->id to -1 at first.
Kenichi Handa <handa@m17n.org>
parents: 98115
diff changeset
1018 cmp_it->id = -1;
98115
463a86221cdd (composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 98107
diff changeset
1019 cmp_it->ch = -2;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1020 cmp_it->reversed_p = 0;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1021 cmp_it->stop_pos = endpos;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1022 if (charpos == endpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1023 return;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1024 /* FIXME: Bidi is not yet handled well in static composition. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1025 if (charpos < endpos
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1026 && find_composition (charpos, endpos, &start, &end, &prop, string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1027 && COMPOSITION_VALID_P (start, end, prop))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1028 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1029 cmp_it->stop_pos = endpos = start;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1030 cmp_it->ch = -1;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1031 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1032 if (NILP (current_buffer->enable_multibyte_characters)
106812
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1033 || NILP (Vauto_composition_mode))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1034 return;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1035 if (bytepos < 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1036 {
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1037 if (NILP (string))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1038 bytepos = CHAR_TO_BYTE (charpos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1039 else
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1040 bytepos = string_char_to_byte (string, charpos);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1041 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1042
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1043 start = charpos;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1044 if (charpos < endpos)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1045 {
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1046 /* Forward search. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1047 while (charpos < endpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1048 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1049 if (STRINGP (string))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1050 FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1051 else
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1052 FETCH_CHAR_ADVANCE (c, charpos, bytepos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1053 if (c == '\n')
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1054 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1055 cmp_it->ch = -2;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1056 break;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1057 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1058 val = CHAR_TABLE_REF (Vcomposition_function_table, c);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1059 if (! NILP (val))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1060 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1061 Lisp_Object elt;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1062 int ridx;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1063
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1064 for (ridx = 0; CONSP (val); val = XCDR (val), ridx++)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1065 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1066 elt = XCAR (val);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1067 if (VECTORP (elt) && ASIZE (elt) == 3
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1068 && NATNUMP (AREF (elt, 1))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1069 && charpos - 1 - XFASTINT (AREF (elt, 1)) >= start)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1070 break;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1071 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1072 if (CONSP (val))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1073 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1074 cmp_it->rule_idx = ridx;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1075 cmp_it->lookback = XFASTINT (AREF (elt, 1));
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1076 cmp_it->stop_pos = charpos - 1 - cmp_it->lookback;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1077 cmp_it->ch = c;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1078 return;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1079 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1080 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1081 }
109972
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1082 if (charpos == endpos)
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1083 {
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1084 /* We couldn't find a composition point before ENDPOS. But,
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1085 some character after ENDPOS may be composed with
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1086 characters before ENDPOS. So, we should stop at the safe
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1087 point. */
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1088 charpos = endpos - MAX_AUTO_COMPOSITION_LOOKBACK;
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1089 if (charpos < start)
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1090 charpos = start;
7a86ccf3260e Fix finding a stop position for composition.
Kenichi Handa <handa@m17n.org>
parents: 109573
diff changeset
1091 }
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1092 }
108784
009ef331a2bc Fix for finding a static composition.
Kenichi Handa <handa@etlken>
parents: 108759
diff changeset
1093 else if (charpos > endpos)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1094 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1095 /* Search backward for a pattern that may be composed and the
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1096 position of (possibly) the last character of the match is
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1097 closest to (but not after) START. The reason for the last
108570
dce075eda1bf Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents: 108552
diff changeset
1098 character is that set_iterator_to_next works in reverse order,
dce075eda1bf Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents: 108552
diff changeset
1099 and thus we must stop at the last character for composition
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1100 check. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1101 unsigned char *p;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1102 int len;
108570
dce075eda1bf Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents: 108552
diff changeset
1103 /* Limit byte position used in fast_looking_at. This is the
dce075eda1bf Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents: 108552
diff changeset
1104 byte position of the character after START. */
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1105 EMACS_INT limit;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1106
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1107 if (NILP (string))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1108 p = BYTE_POS_ADDR (bytepos);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1109 else
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1110 p = SDATA (string) + bytepos;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1111 c = STRING_CHAR_AND_LENGTH (p, len);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1112 limit = bytepos + len;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1113 while (CHAR_COMPOSABLE_P (c))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1114 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1115 val = CHAR_TABLE_REF (Vcomposition_function_table, c);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1116 if (! NILP (val))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1117 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1118 Lisp_Object elt;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1119 int ridx, back, len;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1120
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1121 for (ridx = 0; CONSP (val); val = XCDR (val), ridx++)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1122 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1123 elt = XCAR (val);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1124 if (VECTORP (elt) && ASIZE (elt) == 3
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1125 && NATNUMP (AREF (elt, 1))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1126 && charpos - (back = XFASTINT (AREF (elt, 1))) > endpos)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1127 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1128 EMACS_INT cpos = charpos - back, bpos;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1129
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1130 if (back == 0)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1131 bpos = bytepos;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1132 else
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1133 bpos = (NILP (string) ? CHAR_TO_BYTE (cpos)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1134 : string_char_to_byte (string, cpos));
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1135 if (STRINGP (AREF (elt, 0)))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1136 len = fast_looking_at (AREF (elt, 0), cpos, bpos,
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1137 start + 1, limit, string);
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1138 else
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1139 len = 1;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1140 if (len > 0)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1141 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1142 /* Make CPOS point to the last character of
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1143 match. Note that LEN is byte-length. */
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1144 if (len > 1)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1145 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1146 bpos += len;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1147 if (NILP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1148 cpos = BYTE_TO_CHAR (bpos) - 1;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1149 else
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1150 cpos = string_byte_to_char (string, bpos) - 1;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1151 }
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1152 back = cpos - (charpos - back);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1153 if (cmp_it->stop_pos < cpos
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1154 || (cmp_it->stop_pos == cpos
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1155 && cmp_it->lookback < back))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1156 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1157 cmp_it->rule_idx = ridx;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1158 cmp_it->stop_pos = cpos;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1159 cmp_it->ch = c;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1160 cmp_it->lookback = back;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1161 cmp_it->nchars = back + 1;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1162 }
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1163 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1164 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1165 }
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1166 }
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1167 if (charpos - 1 == endpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1168 break;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1169 if (STRINGP (string))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1170 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1171 p--, bytepos--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1172 while (! CHAR_HEAD_P (*p))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1173 p--, bytepos--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1174 charpos--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1175 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1176 else
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1177 {
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1178 DEC_BOTH (charpos, bytepos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1179 p = BYTE_POS_ADDR (bytepos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1180 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1181 c = STRING_CHAR (p);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1182 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1183 if (cmp_it->ch >= 0)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1184 /* We found a position to check. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1185 return;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1186 /* Skip all uncomposable characters. */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1187 if (NILP (string))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1188 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1189 while (charpos - 1 > endpos && ! CHAR_COMPOSABLE_P (c))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1190 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1191 DEC_BOTH (charpos, bytepos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1192 c = FETCH_MULTIBYTE_CHAR (bytepos);
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1193 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1194 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1195 else
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1196 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1197 while (charpos - 1 > endpos && ! CHAR_COMPOSABLE_P (c))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1198 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1199 p--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1200 while (! CHAR_HEAD_P (*p))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1201 p--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1202 charpos--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1203 c = STRING_CHAR (p);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1204 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1205 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1206 }
98115
463a86221cdd (composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 98107
diff changeset
1207 cmp_it->stop_pos = charpos;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1208 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1209
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1210 /* Check if the character at CHARPOS (and BYTEPOS) is composed
99512
0ba1e475119f Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 99301
diff changeset
1211 (possibly with the following characters) on window W. ENDPOS limits
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1212 characters to be composed. FACE, in non-NULL, is a base face of
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1213 the character. If STRING is not nil, it is a string containing the
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1214 character to check, and CHARPOS and BYTEPOS are indices in the
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1215 string. In that case, FACE must not be NULL.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1216
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1217 If the character is composed, setup members of CMP_IT (id, nglyphs,
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1218 from, to, reversed_p), and return 1. Otherwise, update
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1219 CMP_IT->stop_pos, and return 0. */
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1220
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1221 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1222 composition_reseat_it (struct composition_it *cmp_it, EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT endpos, struct window *w, struct face *face, Lisp_Object string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1223 {
109976
26e31bcc4b06 Allow composition striding over PT.
Kenichi Handa <handa@m17n.org>
parents: 109972
diff changeset
1224 if (endpos < 0)
26e31bcc4b06 Allow composition striding over PT.
Kenichi Handa <handa@m17n.org>
parents: 109972
diff changeset
1225 endpos = NILP (string) ? BEGV : 0;
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1226
98107
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1227 if (cmp_it->ch == -2)
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1228 {
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1229 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string);
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1230 if (cmp_it->ch == -2 || cmp_it->stop_pos != charpos)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1231 /* The current position is not composed. */
98107
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1232 return 0;
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1233 }
77ec19652e4d (composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents: 98100
diff changeset
1234
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1235 if (cmp_it->ch < 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1236 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1237 /* We are looking at a static composition. */
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1238 EMACS_INT start, end;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1239 Lisp_Object prop;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1240
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1241 find_composition (charpos, -1, &start, &end, &prop, string);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1242 cmp_it->id = get_composition_id (charpos, bytepos, end - start,
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1243 prop, string);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1244 if (cmp_it->id < 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1245 goto no_composition;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1246 cmp_it->nchars = end - start;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1247 cmp_it->nglyphs = composition_table[cmp_it->id]->glyph_len;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1248 }
98156
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1249 else if (w)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1250 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1251 Lisp_Object lgstring = Qnil;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1252 Lisp_Object val, elt, re;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1253 int len, i;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1254
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1255 val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch);
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1256 for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val));
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1257 if (charpos < endpos)
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1258 {
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1259 for (; CONSP (val); val = XCDR (val))
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1260 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1261 elt = XCAR (val);
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1262 if (! VECTORP (elt) || ASIZE (elt) != 3
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1263 || ! INTEGERP (AREF (elt, 1)))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1264 continue;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1265 if (XFASTINT (AREF (elt, 1)) != cmp_it->lookback)
108881
5582106cddf0 Remove obsolete pre-unicode2 macros.
Juanma Barranquero <lekktu@gmail.com>
parents: 108784
diff changeset
1266 goto no_composition;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1267 lgstring = autocmp_chars (elt, charpos, bytepos, endpos,
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1268 w, face, string);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1269 if (composition_gstring_p (lgstring))
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1270 break;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1271 lgstring = Qnil;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1272 /* Composition failed perhaps because the font doesn't
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1273 support sufficient range of characters. Try the
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1274 other composition rules if any. */
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1275 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1276 cmp_it->reversed_p = 0;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1277 }
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1278 else
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1279 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1280 EMACS_INT cpos = charpos, bpos = bytepos;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1281
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1282 while (1)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1283 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1284 elt = XCAR (val);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1285 if (cmp_it->lookback > 0)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1286 {
109976
26e31bcc4b06 Allow composition striding over PT.
Kenichi Handa <handa@m17n.org>
parents: 109972
diff changeset
1287 cpos = charpos - cmp_it->lookback;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1288 if (STRINGP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1289 bpos = string_char_to_byte (string, cpos);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1290 else
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1291 bpos = CHAR_TO_BYTE (cpos);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1292 }
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1293 lgstring = autocmp_chars (elt, cpos, bpos, charpos + 1, w, face,
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1294 string);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1295 if (composition_gstring_p (lgstring)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1296 && cpos + LGSTRING_CHAR_LEN (lgstring) - 1 == charpos)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1297 break;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1298 /* Composition failed or didn't cover the current
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1299 character. */
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1300 if (cmp_it->lookback == 0)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1301 goto no_composition;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1302 lgstring = Qnil;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1303 /* Try to find a shorter compostion that starts after CPOS. */
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1304 composition_compute_stop_pos (cmp_it, charpos, bytepos, cpos,
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1305 string);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1306 if (cmp_it->ch == -2 || cmp_it->stop_pos < charpos)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1307 goto no_composition;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1308 val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1309 for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val));
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1310 }
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1311 cmp_it->reversed_p = 1;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1312 }
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1313 if (NILP (lgstring))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1314 goto no_composition;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1315 if (NILP (LGSTRING_ID (lgstring)))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1316 lgstring = composition_gstring_put_cache (lgstring, -1);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1317 cmp_it->id = XINT (LGSTRING_ID (lgstring));
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1318 for (i = 0; i < LGSTRING_GLYPH_LEN (lgstring); i++)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1319 if (NILP (LGSTRING_GLYPH (lgstring, i)))
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1320 break;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1321 cmp_it->nglyphs = i;
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1322 cmp_it->from = 0;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1323 cmp_it->to = i;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1324 }
98156
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1325 else
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1326 goto no_composition;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1327 return 1;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1328
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1329 no_composition:
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1330 if (charpos == endpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1331 return 0;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1332 if (charpos < endpos)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1333 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1334 charpos++;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1335 if (NILP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1336 INC_POS (bytepos);
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1337 else
108881
5582106cddf0 Remove obsolete pre-unicode2 macros.
Juanma Barranquero <lekktu@gmail.com>
parents: 108784
diff changeset
1338 bytepos += BYTES_BY_CHAR_HEAD (*(SDATA (string) + bytepos));
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1339 }
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1340 else
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1341 {
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1342 charpos--;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1343 /* BYTEPOS is calculated in composition_compute_stop_pos */
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1344 bytepos = -1;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1345 }
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1346 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1347 return 0;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1348 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1349
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1350 /* Update charpos, nchars, nbytes, and width of the current grapheme
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1351 cluster.
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1352
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1353 If the composition is static or automatic in L2R context, the
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1354 cluster is identified by CMP_IT->from, and CHARPOS is the position
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1355 of the first character of the cluster. In this case, update
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1356 CMP_IT->to too.
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1357
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1358 If the composition is automatic in R2L context, the cluster is
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1359 identified by CMP_IT->to, and CHARPOS is the position of the last
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1360 character of the cluster. In this case, update CMP_IT->from too.
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1361
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1362 The return value is the character code of the first character of
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1363 the cluster, or -1 if the composition is somehow broken. */
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1364
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1365 int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1366 composition_update_it (struct composition_it *cmp_it, EMACS_INT charpos, EMACS_INT bytepos, Lisp_Object string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1367 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1368 int i, c;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1369
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1370 if (cmp_it->ch < 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1371 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1372 /* static composition */
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1373 struct composition *cmp = composition_table[cmp_it->id];
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1374
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1375 cmp_it->charpos = charpos;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1376 cmp_it->to = cmp_it->nglyphs;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1377 if (cmp_it->nglyphs == 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1378 c = -1;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1379 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1380 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1381 for (i = 0; i < cmp->glyph_len; i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1382 if ((c = COMPOSITION_GLYPH (cmp, i)) != '\t')
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1383 break;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1384 if (c == '\t')
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1385 c = ' ';
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1386 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1387 cmp_it->width = cmp->width;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1388 charpos += cmp_it->nchars;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1389 if (STRINGP (string))
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1390 cmp_it->nbytes = string_char_to_byte (string, charpos) - bytepos;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1391 else
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1392 cmp_it->nbytes = CHAR_TO_BYTE (charpos) - bytepos;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1393 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1394 else
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1395 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1396 /* automatic composition */
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1397 Lisp_Object gstring = composition_gstring_from_id (cmp_it->id);
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1398 Lisp_Object glyph;
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
1399 EMACS_INT from;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1400
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1401 if (cmp_it->nglyphs == 0)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1402 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1403 cmp_it->nchars = LGSTRING_CHAR_LEN (gstring);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1404 cmp_it->width = 0;
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1405 cmp_it->from = cmp_it->to = 0;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1406 return -1;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1407 }
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1408 if (! cmp_it->reversed_p)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1409 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1410 glyph = LGSTRING_GLYPH (gstring, cmp_it->from);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1411 from = LGLYPH_FROM (glyph);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1412 for (cmp_it->to = cmp_it->from + 1; cmp_it->to < cmp_it->nglyphs;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1413 cmp_it->to++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1414 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1415 glyph = LGSTRING_GLYPH (gstring, cmp_it->to);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1416 if (LGLYPH_FROM (glyph) != from)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1417 break;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1418 }
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1419 cmp_it->charpos = charpos;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1420 }
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1421 else
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1422 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1423 glyph = LGSTRING_GLYPH (gstring, cmp_it->to - 1);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1424 from = LGLYPH_FROM (glyph);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1425 cmp_it->charpos = charpos - (LGLYPH_TO (glyph) - from);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1426 for (cmp_it->from = cmp_it->to - 1; cmp_it->from > 0;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1427 cmp_it->from--)
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1428 {
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1429 glyph = LGSTRING_GLYPH (gstring, cmp_it->from - 1);
108552
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1430 if (LGLYPH_FROM (glyph) != from)
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1431 break;
03ab6621f67d Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents: 108375
diff changeset
1432 }
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1433 }
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1434 glyph = LGSTRING_GLYPH (gstring, cmp_it->from);
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1435 cmp_it->nchars = LGLYPH_TO (glyph) + 1 - from;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1436 cmp_it->nbytes = 0;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1437 cmp_it->width = 0;
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1438 for (i = cmp_it->nchars - 1; i >= 0; i--)
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1439 {
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1440 c = XINT (LGSTRING_CHAR (gstring, i));
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1441 cmp_it->nbytes += CHAR_BYTES (c);
110020
e42c7e9e39ad composite.c (composition_update_it): Fix previous change
Kenichi Handa <handa@m17n.org>
parents: 110019
diff changeset
1442 cmp_it->width += CHAR_WIDTH (c);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1443 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1444 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1445 return c;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1446 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1447
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1448
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1449 struct position_record
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1450 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1451 EMACS_INT pos, pos_byte;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1452 unsigned char *p;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1453 };
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1454
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
1455 /* Update the members of POSITION to the next character boundary. */
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1456 #define FORWARD_CHAR(POSITION, STOP) \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1457 do { \
98068
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1458 (POSITION).pos++; \
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1459 if ((POSITION).pos == (STOP)) \
98068
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1460 { \
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1461 (POSITION).p = GAP_END_ADDR; \
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1462 (POSITION).pos_byte = GPT_BYTE; \
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1463 } \
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1464 else \
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1465 { \
98100
2eda9a0daa3e (FORWARD_CHAR): Fix calculation of (POSITION).pos_byte.
Kenichi Handa <handa@m17n.org>
parents: 98068
diff changeset
1466 (POSITION).pos_byte += BYTES_BY_CHAR_HEAD (*((POSITION).p)); \
98068
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1467 (POSITION).p += BYTES_BY_CHAR_HEAD (*((POSITION).p)); \
9723eb0d11ab (FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents: 97982
diff changeset
1468 } \
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1469 } while (0)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1470
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
1471 /* Update the members of POSITION to the previous character boundary. */
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1472 #define BACKWARD_CHAR(POSITION, STOP) \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1473 do { \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1474 if ((POSITION).pos == STOP) \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1475 (POSITION).p = GPT_ADDR; \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1476 do { \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1477 (POSITION).pos_byte--; \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1478 (POSITION).p--; \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1479 } while (! CHAR_HEAD_P (*((POSITION).p))); \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1480 (POSITION).pos--; \
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1481 } while (0)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1482
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1483 /* This is like find_composition, but find an automatic composition
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1484 instead. If found, set *GSTRING to the glyph-string representing
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1485 the composition, and return 1. Otherwise, return 0. */
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1486
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1487 static int
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1488 find_automatic_composition (EMACS_INT pos, EMACS_INT limit, EMACS_INT *start, EMACS_INT *end, Lisp_Object *gstring, Lisp_Object string)
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1489 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1490 EMACS_INT head, tail, stop;
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1491 /* Limit to check a composition after POS. */
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1492 EMACS_INT fore_check_limit;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1493 struct position_record orig, cur, check, prev;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1494 Lisp_Object check_val, val, elt;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1495 int check_lookback;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1496 int c;
98156
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1497 Lisp_Object window;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1498 struct window *w;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1499
98158
f9f157d63fd1 (find_automatic_composition): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 98157
diff changeset
1500 window = Fget_buffer_window (Fcurrent_buffer (), Qnil);
98156
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1501 if (NILP (window))
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1502 return 0;
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1503 w = XWINDOW (window);
464ec62a612c (composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents: 98128
diff changeset
1504
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1505 orig.pos = pos;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1506 if (NILP (string))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1507 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1508 head = BEGV, tail = ZV, stop = GPT;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1509 orig.pos_byte = CHAR_TO_BYTE (orig.pos);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1510 orig.p = BYTE_POS_ADDR (orig.pos_byte);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1511 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1512 else
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1513 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1514 head = 0, tail = SCHARS (string), stop = -1;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1515 orig.pos_byte = string_char_to_byte (string, orig.pos);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1516 orig.p = SDATA (string) + orig.pos_byte;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1517 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1518 if (limit < pos)
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1519 fore_check_limit = min (tail, pos + MAX_AUTO_COMPOSITION_LOOKBACK);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1520 else
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1521 fore_check_limit = min (tail, limit + MAX_AUTO_COMPOSITION_LOOKBACK);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1522 cur = orig;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1523
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1524 retry:
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1525 check_val = Qnil;
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1526 /* At first, check if POS is composable. */
106185
f2cea199b0c4 * character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents: 105877
diff changeset
1527 c = STRING_CHAR (cur.p);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1528 if (! CHAR_COMPOSABLE_P (c))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1529 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1530 if (limit < 0)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1531 return 0;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1532 if (limit >= cur.pos)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1533 goto search_forward;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1534 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1535 else
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1536 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1537 val = CHAR_TABLE_REF (Vcomposition_function_table, c);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1538 if (! NILP (val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1539 check_val = val, check = cur;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1540 else
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1541 while (cur.pos + 1 < fore_check_limit)
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1542 {
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1543 EMACS_INT b, e;
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1544
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1545 FORWARD_CHAR (cur, stop);
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1546 if (get_property_and_range (cur.pos, Qcomposition, &val, &b, &e,
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1547 Qnil)
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1548 && COMPOSITION_VALID_P (b, e, val))
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1549 {
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1550 fore_check_limit = cur.pos;
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1551 break;
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1552 }
106185
f2cea199b0c4 * character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents: 105877
diff changeset
1553 c = STRING_CHAR (cur.p);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1554 if (! CHAR_COMPOSABLE_P (c))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1555 break;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1556 val = CHAR_TABLE_REF (Vcomposition_function_table, c);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1557 if (NILP (val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1558 continue;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1559 check_val = val, check = cur;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1560 break;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1561 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1562 cur = orig;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1563 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1564 /* Rewind back to the position where we can safely search forward
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1565 for compositions. */
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1566 while (cur.pos > head)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1567 {
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1568 EMACS_INT b, e;
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1569
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1570 BACKWARD_CHAR (cur, stop);
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1571 if (get_property_and_range (cur.pos, Qcomposition, &val, &b, &e, Qnil)
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1572 && COMPOSITION_VALID_P (b, e, val))
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1573 break;
106185
f2cea199b0c4 * character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents: 105877
diff changeset
1574 c = STRING_CHAR (cur.p);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1575 if (! CHAR_COMPOSABLE_P (c))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1576 break;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1577 val = CHAR_TABLE_REF (Vcomposition_function_table, c);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1578 if (! NILP (val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1579 check_val = val, check = cur;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1580 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1581 prev = cur;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1582 /* Now search forward. */
102726
93ad3a5a4f75 Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 101967
diff changeset
1583 search_forward:
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1584 *gstring = Qnil;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1585 if (! NILP (check_val) || limit >= orig.pos)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1586 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1587 if (NILP (check_val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1588 cur = orig;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1589 else
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1590 cur = check;
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1591 while (cur.pos < fore_check_limit)
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1592 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1593 int need_adjustment = 0;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1594
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1595 if (NILP (check_val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1596 {
106185
f2cea199b0c4 * character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents: 105877
diff changeset
1597 c = STRING_CHAR (cur.p);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1598 check_val = CHAR_TABLE_REF (Vcomposition_function_table, c);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1599 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1600 for (; CONSP (check_val); check_val = XCDR (check_val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1601 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1602 elt = XCAR (check_val);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1603 if (VECTORP (elt) && ASIZE (elt) == 3 && NATNUMP (AREF (elt, 1))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1604 && cur.pos - XFASTINT (AREF (elt, 1)) >= head)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1605 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1606 check.pos = cur.pos - XFASTINT (AREF (elt, 1));
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1607 if (check.pos == cur.pos)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1608 check.pos_byte = cur.pos_byte;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1609 else
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1610 check.pos_byte = CHAR_TO_BYTE (check.pos);
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
1611 val = autocmp_chars (elt, check.pos, check.pos_byte,
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1612 tail, w, NULL, string);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1613 need_adjustment = 1;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1614 if (! NILP (val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1615 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1616 *gstring = val;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1617 *start = check.pos;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1618 *end = check.pos + LGSTRING_CHAR_LEN (*gstring);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1619 if (*start <= orig.pos ? *end > orig.pos
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1620 : limit >= orig.pos)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1621 return 1;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1622 cur.pos = *end;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1623 cur.pos_byte = CHAR_TO_BYTE (cur.pos);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1624 break;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1625 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1626 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1627 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1628 if (need_adjustment)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1629 {
108107
ad640fcce53a Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents: 108105
diff changeset
1630 /* As we have called Lisp, there's a possibility that
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1631 buffer/string is relocated. */
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1632 if (NILP (string))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1633 cur.p = BYTE_POS_ADDR (cur.pos_byte);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1634 else
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1635 cur.p = SDATA (string) + cur.pos_byte;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1636 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1637 if (! CONSP (check_val))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1638 FORWARD_CHAR (cur, stop);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1639 check_val = Qnil;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1640 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1641 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1642 if (! NILP (*gstring))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1643 return (limit >= 0 || (*start <= orig.pos && *end > orig.pos));
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1644 if (limit >= 0 && limit < orig.pos && prev.pos > head)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1645 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1646 cur = prev;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1647 BACKWARD_CHAR (cur, stop);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1648 orig = cur;
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1649 fore_check_limit = orig.pos;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1650 goto retry;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1651 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1652 return 0;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1653 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1654
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1655 /* Return the adjusted point provided that point is moved from LAST_PT
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1656 to NEW_PT. */
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1657
110559
9c63d46e000c Fix int/EMACS_INT use in keyboard.c.
Eli Zaretskii <eliz@gnu.org>
parents: 110504
diff changeset
1658 EMACS_INT
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1659 composition_adjust_point (EMACS_INT last_pt, EMACS_INT new_pt)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1660 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1661 EMACS_INT charpos, bytepos, startpos, beg, end, pos;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1662 Lisp_Object val;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1663 int i;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1664
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1665 if (new_pt == BEGV || new_pt == ZV)
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1666 return new_pt;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1667
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1668 /* At first check the static composition. */
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1669 if (get_property_and_range (new_pt, Qcomposition, &val, &beg, &end, Qnil)
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1670 && COMPOSITION_VALID_P (beg, end, val))
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1671 {
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1672 if (beg < new_pt /* && end > new_pt <- It's always the case. */
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1673 && (last_pt <= beg || last_pt >= end))
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1674 return (new_pt < last_pt ? beg : end);
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1675 return new_pt;
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
1676 }
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1677
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1678 if (NILP (current_buffer->enable_multibyte_characters)
106812
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1679 || NILP (Vauto_composition_mode))
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1680 return new_pt;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1681
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1682 /* Next check the automatic composition. */
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1683 if (! find_automatic_composition (new_pt, (EMACS_INT) -1, &beg, &end, &val,
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1684 Qnil)
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1685 || beg == new_pt)
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1686 return new_pt;
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1687 for (i = 0; i < LGSTRING_GLYPH_LEN (val); i++)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1688 {
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1689 Lisp_Object glyph = LGSTRING_GLYPH (val, i);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1690
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1691 if (NILP (glyph))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1692 break;
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1693 if (beg + LGLYPH_FROM (glyph) == new_pt)
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1694 return new_pt;
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1695 if (beg + LGLYPH_TO (glyph) >= new_pt)
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1696 return (new_pt < last_pt
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1697 ? beg + LGLYPH_FROM (glyph)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1698 : beg + LGLYPH_TO (glyph) + 1);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1699 }
106632
484702d8c582 (composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents: 106185
diff changeset
1700 return new_pt;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1701 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1702
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1703 DEFUN ("composition-get-gstring", Fcomposition_get_gstring,
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1704 Scomposition_get_gstring, 4, 4, 0,
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1705 doc: /* Return a glyph-string for characters between FROM and TO.
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1706 If the glyph string is for graphic display, FONT-OBJECT must be
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1707 a font-object to use for those characters.
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1708 Otherwise (for terminal display), FONT-OBJECT must be a terminal ID, a
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1709 frame, or nil for the selected frame's terminal device.
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1710
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1711 If the optional 4th argument STRING is not nil, it is a string
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1712 containing the target characters between indices FROM and TO.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1713
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1714 A glyph-string is a vector containing information about how to display
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1715 a specific character sequence. The format is:
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1716 [HEADER ID GLYPH ...]
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1717
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1718 HEADER is a vector of this form:
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1719 [FONT-OBJECT CHAR ...]
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1720 where
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1721 FONT-OBJECT is a font-object for all glyphs in the glyph-string,
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1722 or the terminal coding system of the specified terminal.
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1723 CHARs are characters to be composed by GLYPHs.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1724
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1725 ID is an identification number of the glyph-string. It may be nil if
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1726 not yet shaped.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1727
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1728 GLYPH is a vector whose elements have this form:
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1729 [ FROM-IDX TO-IDX C CODE WIDTH LBEARING RBEARING ASCENT DESCENT
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1730 [ [X-OFF Y-OFF WADJUST] | nil] ]
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1731 where
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1732 FROM-IDX and TO-IDX are used internally and should not be touched.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1733 C is the character of the glyph.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1734 CODE is the glyph-code of C in FONT-OBJECT.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1735 WIDTH thru DESCENT are the metrics (in pixels) of the glyph.
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1736 X-OFF and Y-OFF are offsets to the base position for the glyph.
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1737 WADJUST is the adjustment to the normal width of the glyph.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1738
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1739 If GLYPH is nil, the remaining elements of the glyph-string vector
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1740 should be ignored. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109126
diff changeset
1741 (Lisp_Object from, Lisp_Object to, Lisp_Object font_object, Lisp_Object string)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1742 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1743 Lisp_Object gstring, header;
98213
52d26067a946 (Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 98209
diff changeset
1744 EMACS_INT frompos, topos;
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1745
98214
5803b1114219 (fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents: 98213
diff changeset
1746 CHECK_NATNUM (from);
5803b1114219 (fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents: 98213
diff changeset
1747 CHECK_NATNUM (to);
101775
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1748 if (! FONT_OBJECT_P (font_object))
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1749 {
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1750 struct coding_system *coding;
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1751 struct terminal *terminal = get_terminal (font_object, 1);
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1752
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1753 coding = ((TERMINAL_TERMINAL_CODING (terminal)->common_flags
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1754 & CODING_REQUIRE_ENCODING_MASK)
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1755 ? TERMINAL_TERMINAL_CODING (terminal) : &safe_terminal_coding);
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1756 font_object = CODING_ID_NAME (coding->id);
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1757 }
250ce1fa6aed Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
1758
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1759 header = fill_gstring_header (Qnil, from, to, font_object, string);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1760 gstring = gstring_lookup_cache (header);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1761 if (! NILP (gstring))
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1762 return gstring;
98213
52d26067a946 (Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 98209
diff changeset
1763
98214
5803b1114219 (fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents: 98213
diff changeset
1764 frompos = XINT (from);
5803b1114219 (fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents: 98213
diff changeset
1765 topos = XINT (to);
98213
52d26067a946 (Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 98209
diff changeset
1766 if (LGSTRING_GLYPH_LEN (gstring_work) < topos - frompos)
52d26067a946 (Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 98209
diff changeset
1767 gstring_work = Fmake_vector (make_number (topos - frompos + 2), Qnil);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1768 LGSTRING_SET_HEADER (gstring_work, header);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1769 LGSTRING_SET_ID (gstring_work, Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1770 fill_gstring_body (gstring_work);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1771 return gstring_work;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1772 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1773
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1774
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1775 /* Emacs Lisp APIs. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1776
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1777 DEFUN ("compose-region-internal", Fcompose_region_internal,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1778 Scompose_region_internal, 2, 4, 0,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1779 doc: /* Internal use only.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1780
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1781 Compose text in the region between START and END.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1782 Optional 3rd and 4th arguments are COMPONENTS and MODIFICATION-FUNC
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1783 for the composition. See `compose-region' for more details. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109126
diff changeset
1784 (Lisp_Object start, Lisp_Object end, Lisp_Object components, Lisp_Object modification_func)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1785 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1786 validate_region (&start, &end);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1787 if (!NILP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1788 && !INTEGERP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1789 && !CONSP (components)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1790 && !STRINGP (components))
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1791 CHECK_VECTOR (components);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1792
64574
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
1793 compose_text (XINT (start), XINT (end), components, modification_func, Qnil);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1794 return Qnil;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1795 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1796
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1797 DEFUN ("compose-string-internal", Fcompose_string_internal,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1798 Scompose_string_internal, 3, 5, 0,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1799 doc: /* Internal use only.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1800
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1801 Compose text between indices START and END of STRING.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1802 Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1803 for the composition. See `compose-string' for more details. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109126
diff changeset
1804 (Lisp_Object string, Lisp_Object start, Lisp_Object end, Lisp_Object components, Lisp_Object modification_func)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1805 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1806 CHECK_STRING (string);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1807 CHECK_NUMBER (start);
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1808 CHECK_NUMBER (end);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1809
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1810 if (XINT (start) < 0 ||
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1811 XINT (start) > XINT (end)
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46293
diff changeset
1812 || XINT (end) > SCHARS (string))
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1813 args_out_of_range (start, end);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1814
64574
5c90d9a42573 (Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents: 64084
diff changeset
1815 compose_text (XINT (start), XINT (end), components, modification_func, string);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1816 return string;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1817 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1818
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1819 DEFUN ("find-composition-internal", Ffind_composition_internal,
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
1820 Sfind_composition_internal, 4, 4, 0,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1821 doc: /* Internal use only.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1822
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1823 Return information about composition at or nearest to position POS.
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1824 See `find-composition' for more details. */)
109179
8cfee7d2955f Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109126
diff changeset
1825 (Lisp_Object pos, Lisp_Object limit, Lisp_Object string, Lisp_Object detail_p)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1826 {
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1827 Lisp_Object prop, tail, gstring;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1828 EMACS_INT start, end, from, to;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1829 int id;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1830
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1831 CHECK_NUMBER_COERCE_MARKER (pos);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1832 from = XINT (pos);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1833 if (!NILP (limit))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1834 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1835 CHECK_NUMBER_COERCE_MARKER (limit);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1836 to = XINT (limit);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1837 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1838 else
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1839 to = -1;
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
1840
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1841 if (!NILP (string))
38097
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1842 {
40656
cdfd4d09b79a Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents: 39973
diff changeset
1843 CHECK_STRING (string);
46370
40db0673e6f0 Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents: 46293
diff changeset
1844 if (XINT (pos) < 0 || XINT (pos) > SCHARS (string))
38097
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1845 args_out_of_range (string, pos);
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1846 }
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1847 else
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1848 {
38116
a85b9df3dffb (Ffind_composition_internal): Accept ZV
Gerd Moellmann <gerd@gnu.org>
parents: 38098
diff changeset
1849 if (XINT (pos) < BEGV || XINT (pos) > ZV)
38097
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1850 args_out_of_range (Fcurrent_buffer (), pos);
8757fe98656e (Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents: 37242
diff changeset
1851 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1852
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1853 if (!find_composition (from, to, &start, &end, &prop, string))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1854 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1855 if (!NILP (current_buffer->enable_multibyte_characters)
106812
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1856 && ! NILP (Vauto_composition_mode)
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1857 && find_automatic_composition (from, to, &start, &end, &gstring,
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1858 string))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1859 return list3 (make_number (start), make_number (end), gstring);
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1860 return Qnil;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1861 }
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1862 if ((end <= XINT (pos) || start > XINT (pos)))
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1863 {
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1864 EMACS_INT s, e;
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1865
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1866 if (find_automatic_composition (from, to, &s, &e, &gstring, string)
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1867 && (e <= XINT (pos) ? e > end : s < start))
108117
fb2072139c80 composite.c (Ffind_composition_internal): Fix the return value for an automatic composition.
Kenichi Handa <handa@etlken>
parents: 108107
diff changeset
1868 return list3 (make_number (s), make_number (e), gstring);
97982
59bcf1726f2c (autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents: 97887
diff changeset
1869 }
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1870 if (!COMPOSITION_VALID_P (start, end, prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1871 return Fcons (make_number (start), Fcons (make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1872 Fcons (Qnil, Qnil)));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1873 if (NILP (detail_p))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1874 return Fcons (make_number (start), Fcons (make_number (end),
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1875 Fcons (Qt, Qnil)));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1876
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1877 if (COMPOSITION_REGISTERD_P (prop))
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1878 id = COMPOSITION_ID (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1879 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1880 {
110504
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
1881 EMACS_INT start_byte = (NILP (string)
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
1882 ? CHAR_TO_BYTE (start)
0fdd992ff057 Fix more uses of int instead of EMACS_INT.
Eli Zaretskii <eliz@gnu.org>
parents: 110020
diff changeset
1883 : string_char_to_byte (string, start));
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1884 id = get_composition_id (start, start_byte, end - start, prop, string);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1885 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1886
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1887 if (id >= 0)
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1888 {
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1889 Lisp_Object components, relative_p, mod_func;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1890 enum composition_method method = COMPOSITION_METHOD (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1891 int width = composition_table[id]->width;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1892
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1893 components = Fcopy_sequence (COMPOSITION_COMPONENTS (prop));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1894 relative_p = (method == COMPOSITION_WITH_RULE_ALTCHARS
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1895 ? Qnil : Qt);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1896 mod_func = COMPOSITION_MODIFICATION_FUNC (prop);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1897 tail = Fcons (components,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1898 Fcons (relative_p,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1899 Fcons (mod_func,
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1900 Fcons (make_number (width), Qnil))));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1901 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1902 else
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1903 tail = Qnil;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1904
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1905 return Fcons (make_number (start), Fcons (make_number (end), tail));
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1906 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1907
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1908
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1909 void
109126
aec1143e8d85 Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 109100
diff changeset
1910 syms_of_composite (void)
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1911 {
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1912 int i;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1913
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
1914 Qcomposition = intern_c_string ("composition");
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1915 staticpro (&Qcomposition);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1916
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1917 /* Make a hash table for static composition. */
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1918 {
28472
bae9218986ac * composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents: 26848
diff changeset
1919 Lisp_Object args[6];
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 49136
diff changeset
1920
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1921 args[0] = QCtest;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1922 args[1] = Qequal;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1923 args[2] = QCweakness;
53316
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
1924 /* We used to make the hash table weak so that unreferenced
92028
462b9983854e Fix comment typo.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
1925 compositions can be garbage-collected. But, usually once
53316
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
1926 created compositions are repeatedly used in an Emacs session,
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
1927 and thus it's not worth to save memory in such a way. So, we
0c88991a93ee *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 53221
diff changeset
1928 make the table not weak. */
53221
94ae4d74b7e0 (syms_of_composite): Don't make the compostion hash table week.
Kenichi Handa <handa@m17n.org>
parents: 52401
diff changeset
1929 args[3] = Qnil;
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1930 args[4] = QCsize;
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1931 args[5] = make_number (311);
28472
bae9218986ac * composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents: 26848
diff changeset
1932 composition_hash_table = Fmake_hash_table (6, args);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1933 staticpro (&composition_hash_table);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1934 }
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1935
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1936 /* Make a hash table for glyph-string. */
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1937 {
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1938 Lisp_Object args[6];
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1939 args[0] = QCtest;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1940 args[1] = Qequal;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1941 args[2] = QCweakness;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1942 args[3] = Qnil;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1943 args[4] = QCsize;
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1944 args[5] = make_number (311);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1945 gstring_hash_table = Fmake_hash_table (6, args);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1946 staticpro (&gstring_hash_table);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1947 }
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1948
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1949 staticpro (&gstring_work_headers);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1950 gstring_work_headers = Fmake_vector (make_number (8), Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1951 for (i = 0; i < 8; i++)
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1952 ASET (gstring_work_headers, i, Fmake_vector (make_number (i + 2), Qnil));
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1953 staticpro (&gstring_work);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1954 gstring_work = Fmake_vector (make_number (10), Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
1955
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1956 /* Text property `composition' should be nonsticky by default. */
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1957 Vtext_property_default_nonsticky
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1958 = Fcons (Fcons (Qcomposition, Qt), Vtext_property_default_nonsticky);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1959
112364
42e22c4f06b7 Move all DEFVAR'd globals into a structure -- threading infrastructure
Tom Tromey <tromey@redhat.com>
parents: 112278
diff changeset
1960 DEFVAR_LISP ("compose-chars-after-function", Vcompose_chars_after_function,
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1961 doc: /* Function to adjust composition of buffer text.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1962
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1963 This function is called with three arguments: FROM, TO, and OBJECT.
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1964 FROM and TO specify the range of text whose composition should be
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1965 adjusted. OBJECT, if non-nil, is a string that contains the text.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1966
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1967 This function is called after a text with `composition' property is
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1968 inserted or deleted to keep `composition' property of buffer text
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1969 valid.
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1970
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1971 The default value is the function `compose-chars-after'. */);
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
1972 Vcompose_chars_after_function = intern_c_string ("compose-chars-after");
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1973
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
1974 Qauto_composed = intern_c_string ("auto-composed");
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
1975 staticpro (&Qauto_composed);
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
1976
105877
21bdda3ded62 * xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105669
diff changeset
1977 Qauto_composition_function = intern_c_string ("auto-composition-function");
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
1978 staticpro (&Qauto_composition_function);
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
1979
112364
42e22c4f06b7 Move all DEFVAR'd globals into a structure -- threading infrastructure
Tom Tromey <tromey@redhat.com>
parents: 112278
diff changeset
1980 DEFVAR_LISP ("auto-composition-mode", Vauto_composition_mode,
106812
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1981 doc: /* Non-nil if Auto-Composition mode is enabled.
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1982 Use the command `auto-composition-mode' to change this variable. */);
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1983 Vauto_composition_mode = Qt;
23c562723a8d Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents: 106799
diff changeset
1984
112364
42e22c4f06b7 Move all DEFVAR'd globals into a structure -- threading infrastructure
Tom Tromey <tromey@redhat.com>
parents: 112278
diff changeset
1985 DEFVAR_LISP ("auto-composition-function", Vauto_composition_function,
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
1986 doc: /* Function to call to compose characters automatically.
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1987 This function is called from the display routine with four arguments:
91287
ac1b29b04053 (syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents: 91132
diff changeset
1988 FROM, TO, WINDOW, and STRING.
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1989
91287
ac1b29b04053 (syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents: 91132
diff changeset
1990 If STRING is nil, the function must compose characters in the region
ac1b29b04053 (syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents: 91132
diff changeset
1991 between FROM and TO in the current buffer.
41001
a17c8b15ef1b Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents: 40656
diff changeset
1992
91287
ac1b29b04053 (syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents: 91132
diff changeset
1993 Otherwise, STRING is a string, and FROM and TO are indices into the
ac1b29b04053 (syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents: 91132
diff changeset
1994 string. In this case, the function must compose characters in the
ac1b29b04053 (syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents: 91132
diff changeset
1995 string. */);
89283
6ed290fbc678 (Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents: 88929
diff changeset
1996 Vauto_composition_function = Qnil;
33240
aaa42106f0da (Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents: 30171
diff changeset
1997
112364
42e22c4f06b7 Move all DEFVAR'd globals into a structure -- threading infrastructure
Tom Tromey <tromey@redhat.com>
parents: 112278
diff changeset
1998 DEFVAR_LISP ("composition-function-table", Vcomposition_function_table,
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
1999 doc: /* Char-table of functions for automatic character composition.
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2000 For each character that has to be composed automatically with
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2001 preceding and/or following characters, this char-table contains
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2002 a function to call to compose that character.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2003
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2004 The element at index C in the table, if non-nil, is a list of
108759
0bb727f1d547 Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents: 108570
diff changeset
2005 composition rules of this form: ([PATTERN PREV-CHARS FUNC] ...)
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2006
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
2007 PATTERN is a regular expression which C and the surrounding
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2008 characters must match.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2009
101967
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
2010 PREV-CHARS is a non-negative integer (less than 4) specifying how many
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
2011 characters before C to check the matching with PATTERN. If it is 0,
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
2012 PATTERN must match C and the following characters. If it is 1,
1127170a5c39 (MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents: 101775
diff changeset
2013 PATTERN must match a character before C and the following characters.
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2014
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2015 If PREV-CHARS is 0, PATTERN can be nil, which means that the
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2016 single character C should be composed.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2017
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2018 FUNC is a function to return a glyph-string representing a
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
2019 composition of the characters that match PATTERN. It is
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2020 called with one argument GSTRING.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2021
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2022 GSTRING is a template of a glyph-string to return. It is already
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2023 filled with a proper header for the characters to compose, and
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2024 glyphs corresponding to those characters one by one. The
98369
690a23ccfcf9 (Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents: 98214
diff changeset
2025 function must return a new glyph-string with the same header as
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2026 GSTRING, or modify GSTRING itself and return it.
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2027
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2028 See also the documentation of `auto-composition-mode'. */);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2029 Vcomposition_function_table = Fmake_char_table (Qnil, Qnil);
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2030
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2031 defsubr (&Scompose_region_internal);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2032 defsubr (&Scompose_string_internal);
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2033 defsubr (&Sfind_composition_internal);
97819
23390849e8b8 Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents: 96413
diff changeset
2034 defsubr (&Scomposition_get_gstring);
26848
d502b027b817 New file
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2035 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
2036