Пример #1
0
 public Join()
 {
     CubeID         = -1;
     JoinCube       = -1;
     FieldName      = "";
     JoinField      = "";
     JoinType       = JoiningType._DIRECTJOIN;
     JoinCubeFields = "";
 }
Пример #2
0
        private static ExpressionTreeBase ExtractItem(ExpressionTreeBase item, out JoiningType? type, out bool negate, out ConditionalExpression lastParent)
        {
            lastParent = null;
            type = GetJoiningType(item);

            if (item is ConditionalExpression && !(item is NotCondition))
            {
                lastParent = (ConditionalExpression)item;
                item = ((ConditionalExpression)item).Child;
            }

            if (item is NotCondition)
            {
                negate = true;
                item = ((NotCondition)item).Child;
            }
            else
            {
                negate = false;
            }

            return item;
        }
        /// <inheritdoc/>
        public override void AssignFeatures(IGlyphShapingCollection collection, int index, int count)
        {
            this.AddFeature(collection, index, count, CcmpTag);
            this.AddFeature(collection, index, count, LoclTag);
            this.AddFeature(collection, index, count, IsolTag, false);
            this.AddFeature(collection, index, count, FinaTag, false);
            this.AddFeature(collection, index, count, Fin2Tag, false);
            this.AddFeature(collection, index, count, Fin3Tag, false);
            this.AddFeature(collection, index, count, MediTag, false);
            this.AddFeature(collection, index, count, Med2Tag, false);
            this.AddFeature(collection, index, count, InitTag, false);
            this.AddFeature(collection, index, count, MsetTag);

            base.AssignFeatures(collection, index, count);

            int prev  = -1;
            int state = 0;

            byte[] actions = new byte[count];

            // Apply the state machine to map glyphs to features.
            for (int i = 0; i < count; i++)
            {
                GlyphShapingData data         = collection.GetGlyphShapingData(i + index);
                JoiningClass     joiningClass = CodePoint.GetJoiningClass(data.CodePoint);
                JoiningType      joiningType  = joiningClass.JoiningType;
                if (joiningType == JoiningType.Transparent)
                {
                    actions[i] = None;
                    continue;
                }

                int    shapingClassIndex = GetShapingClassIndex(joiningType);
                byte[] actionsWithState  = StateTable[state, shapingClassIndex];
                byte   prevAction        = actionsWithState[0];
                byte   curAction         = actionsWithState[1];
                state = actionsWithState[2];

                if (prevAction != None && prev != -1)
                {
                    actions[prev] = prevAction;
                }

                actions[i] = curAction;
                prev       = i;
            }

            // Apply the chosen features to their respective glyphs.
            for (int i = 0; i < actions.Length; i++)
            {
                switch (actions[i])
                {
                case Fina:
                    collection.EnableShapingFeature(i + index, FinaTag);
                    break;

                case Fin2:
                    collection.EnableShapingFeature(i + index, Fin2Tag);
                    break;

                case Fin3:
                    collection.EnableShapingFeature(i + index, Fin3Tag);
                    break;

                case Isol:
                    collection.EnableShapingFeature(i + index, IsolTag);
                    break;

                case Init:
                    collection.EnableShapingFeature(i + index, InitTag);
                    break;

                case Medi:
                    collection.EnableShapingFeature(i + index, MediTag);
                    break;

                case Med2:
                    collection.EnableShapingFeature(i + index, Med2Tag);
                    break;
                }
            }
        }
 private static int GetShapingClassIndex(JoiningType joiningType) => joiningType switch
 {