/// <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); }
/** * 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); }