Esempio n. 1
0
        /// <summary>
        /// Allocates new shape id for the new drawing group id.
        /// </summary>
        /// <param name="drawingGroupId"></param>
        /// <param name="dg"></param>
        /// <returns>a new shape id.</returns>
        public virtual int AllocateShapeId(short drawingGroupId, EscherDgRecord dg)
        {
            dgg.NumShapesSaved = (dgg.NumShapesSaved + 1);

            // Add to existing cluster if space available
            for (int i = 0; i < dgg.FileIdClusters.Length; i++)
            {
                EscherDggRecord.FileIdCluster c = dgg.FileIdClusters[i];
                if (c.DrawingGroupId == drawingGroupId && c.NumShapeIdsUsed != 1024)
                {
                    int result = c.NumShapeIdsUsed + (1024 * (i + 1));
                    c.IncrementShapeId();
                    dg.NumShapes   = (dg.NumShapes + 1);
                    dg.LastMSOSPID = (result);
                    if (result >= dgg.ShapeIdMax)
                    {
                        dgg.ShapeIdMax = (result + 1);
                    }
                    return(result);
                }
            }

            // Create new cluster
            dgg.AddCluster(drawingGroupId, 0);
            dgg.FileIdClusters[dgg.FileIdClusters.Length - 1].IncrementShapeId();
            dg.NumShapes = (dg.NumShapes + 1);
            int result2 = (1024 * dgg.FileIdClusters.Length);

            dg.LastMSOSPID = (result2);
            if (result2 >= dgg.ShapeIdMax)
            {
                dgg.ShapeIdMax = (result2 + 1);
            }
            return(result2);
        }
Esempio n. 2
0
        /**
         * Allocates new shape id for the new drawing Group id.
         *
         * @return a new shape id.
         */

        public int AllocateShapeId(short drawingGroupId)
        {
            // Get the last shape id for this drawing Group.
            EscherDgRecord dg          = (EscherDgRecord)dgMap[drawingGroupId];
            int            lastShapeId = dg.LastMSOSPID;

            // Have we run out of shapes for this cluster?
            int newShapeId = 0;

            if (lastShapeId % 1024 == 1023)
            {
                // Yes:
                // Find the starting shape id of the next free cluster
                newShapeId = FindFreeSPIDBlock();
                // Create a new cluster in the dgg record.
                dgg.AddCluster(drawingGroupId, 1);
            }
            else
            {
                // No:
                // Find the cluster for this drawing Group with free space.
                for (int i = 0; i < dgg.FileIdClusters.Length; i++)
                {
                    EscherDggRecord.FileIdCluster c = dgg.FileIdClusters[i];
                    if (c.DrawingGroupId == drawingGroupId)
                    {
                        if (c.NumShapeIdsUsed != 1024)
                        {
                            // Increment the number of shapes used for this cluster.
                            c.IncrementShapeId();
                        }
                    }
                    // If the last shape id = -1 then we know to Find a free block;
                    if (dg.LastMSOSPID == -1)
                    {
                        newShapeId = FindFreeSPIDBlock();
                    }
                    else
                    {
                        // The new shape id to be the last shapeid of this cluster + 1
                        newShapeId = dg.LastMSOSPID + 1;
                    }
                }
            }
            // Increment the total number of shapes used in the dgg.
            dgg.NumShapesSaved = (dgg.NumShapesSaved + 1);
            // Is the new shape id >= max shape id for dgg?
            if (newShapeId >= dgg.ShapeIdMax)
            {
                // Yes:
                // Set the max shape id = new shape id + 1
                dgg.ShapeIdMax = newShapeId + 1;
            }
            // Set last shape id for this drawing Group.
            dg.LastMSOSPID = newShapeId;
            // Increased the number of shapes used for this drawing Group.
            dg.IncrementShapeCount();

            return(newShapeId);
        }