Esempio n. 1
0
        public static CharacterPositionInfo FromXoffset(IntPtr ssa_struct, int x_offset)
        {
            var char_pos      = 0;
            var char_trailing = 0;

            if (ssa_struct == IntPtr.Zero)
            {
                x_offset = 0;
                return(new CharacterPositionInfo());
            }
            var res = NativeScript.ScriptStringXtoCP
                          (ssa_struct,
                          x_offset,
                          ref char_pos,
                          ref char_trailing);

            if (res != NativeScript.S_OK)
            {
                Marshal.ThrowExceptionForHR(res);
            }
            var chars_count = NativeScript.GetPcOutChars(ssa_struct);
            var ret         = new CharacterPositionInfo();

            ret.CharIndex = char_pos;
            ret.Xoffset   = x_offset;
            if (char_trailing == 0)
            {
                if (char_pos == chars_count)
                {
                    ret.PositionType = CharacterPositionType.AfterEnd;
                }
                else
                {
                    ret.PositionType = CharacterPositionType.LeadingEdge;
                }
            }
            else if (char_trailing == 1)
            {
                if (char_pos == -1)
                {
                    ret.PositionType = CharacterPositionType.BeforeBeginning;
                }
                else
                {
                    ret.PositionType = CharacterPositionType.TrailingEdge;
                }
            }
            else
            {
                ret.PositionType = CharacterPositionType.ClusterPart;
                ret.OffsetToNextCaretPosition = char_trailing;
            }
            return(ret);
        }
Esempio n. 2
0
            public void PrepareLayout(IntPtr hdc, IntPtr char_buffer, int max_char_len, int max_width)
            {
                ssa_struct_ptr = NativeScript.ScriptStringAnalyseCall
                                     (hdc,
                                     char_buffer,
                                     max_char_len,
                                     max_width,
                                     tab_def);

                //сколько поместилось
                int chars_clipped = NativeScript.GetPcOutChars(ssa_struct_ptr);

                //просматриваем с конца для поиска разрыва линии
                IntPtr attr_buffer    = NativeScript.ScriptString_pLogAttr(ssa_struct_ptr);
                int    line_break_ind = -1;

                //если вся строка уместилась в линию
                if (chars_clipped == max_char_len)
                {
                    line_break_ind = chars_clipped - 1;
                }

                //если вся строка не уместилась, ищем крайний с конца SoftBreak
                if (line_break_ind == -1)
                {
                    LogicalCharacterAttribute attr = LogicalCharacterAttribute.None;
                    for (int i = chars_clipped - 1; i > 0; i--)
                    {
                        attr = NativeScript.GetCharacterAttribute(attr_buffer, i);
                        if ((attr & LogicalCharacterAttribute.SoftBreak) == LogicalCharacterAttribute.SoftBreak)
                        {
                            line_break_ind = i - 1;
                            break;
                        }
                    }
                }

                //если и softBreak не найден, рвем по умещению
                if (line_break_ind == -1)
                {
                    line_break_ind = chars_clipped - 1;
                }

                //если разрываем, вторично вызываем обссчет с новой длиной строки
                if (line_break_ind + 1 != max_char_len)
                {
                    //освобождаем предыдущий ssa_sctuct_ptr
                    int res3 = NativeScript.ScriptStringFree(ref ssa_struct_ptr);
                    if (res3 != 0)
                    {
                        Marshal.ThrowExceptionForHR(res3);
                    }

                    //и обновляем
                    ssa_struct_ptr = NativeScript.ScriptStringAnalyseCall
                                         (hdc,
                                         char_buffer,
                                         line_break_ind + 1,
                                         tab_def);
                }

                //debug
                //string actual_string = Marshal.PtrToStringAuto(char_buffer, line_break_ind + 1);
                //char[] actual_chars = actual_string.ToCharArray();

                //заполняем свойства
                Extent     = NativeScript.GetScriptStringExtent(ssa_struct_ptr);
                CharLength = line_break_ind + 1;

                //debug
                //if (Extent.Width == 0)
                //{
                //    int debug = 0;
                //}
            }