iTextSharp.text.pdf.CJKFont.ConvertToHCIDMetrics C# (CSharp) Метод

ConvertToHCIDMetrics() статический приватный Метод

static private ConvertToHCIDMetrics ( int keys, IntHashtable h ) : string
keys int
h IntHashtable
Результат string
        internal static string ConvertToHCIDMetrics(int[] keys, IntHashtable h)
        {
            if (keys.Length == 0)
                return null;
            int lastCid = 0;
            int lastValue = 0;
            int start;
            for (start = 0; start < keys.Length; ++start) {
                lastCid = keys[start];
                lastValue = h[lastCid];
                if (lastValue != 0) {
                    ++start;
                    break;
                }
            }
            if (lastValue == 0)
                return null;
            StringBuilder buf = new StringBuilder();
            buf.Append('[');
            buf.Append(lastCid);
            int state = FIRST;
            for (int k = start; k < keys.Length; ++k) {
                int cid = keys[k];
                int value = h[cid];
                if (value == 0)
                    continue;
                switch (state) {
                    case FIRST: {
                        if (cid == lastCid + 1 && value == lastValue) {
                            state = SERIAL;
                        }
                        else if (cid == lastCid + 1) {
                            state = BRACKET;
                            buf.Append('[').Append(lastValue);
                        }
                        else {
                            buf.Append('[').Append(lastValue).Append(']').Append(cid);
                        }
                        break;
                    }
                    case BRACKET: {
                        if (cid == lastCid + 1 && value == lastValue) {
                            state = SERIAL;
                            buf.Append(']').Append(lastCid);
                        }
                        else if (cid == lastCid + 1) {
                            buf.Append(' ').Append(lastValue);
                        }
                        else {
                            state = FIRST;
                            buf.Append(' ').Append(lastValue).Append(']').Append(cid);
                        }
                        break;
                    }
                    case SERIAL: {
                        if (cid != lastCid + 1 || value != lastValue) {
                            buf.Append(' ').Append(lastCid).Append(' ').Append(lastValue).Append(' ').Append(cid);
                            state = FIRST;
                        }
                        break;
                    }
                }
                lastValue = value;
                lastCid = cid;
            }
            switch (state) {
                case FIRST: {
                    buf.Append('[').Append(lastValue).Append("]]");
                    break;
                }
                case BRACKET: {
                    buf.Append(' ').Append(lastValue).Append("]]");
                    break;
                }
                case SERIAL: {
                    buf.Append(' ').Append(lastCid).Append(' ').Append(lastValue).Append(']');
                    break;
                }
            }
            return buf.ToString();
        }