home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / extensions / lib / PEXlib / pl_free.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-27  |  12.7 KB  |  544 lines

  1. /* $XConsortium: pl_free.c,v 1.7 92/10/27 15:43:30 mor Exp $ */
  2.  
  3. /******************************************************************************
  4. Copyright 1992 by the Massachusetts Institute of Technology
  5.  
  6.                         All Rights Reserved
  7.  
  8. Permission to use, copy, modify, distribute, and sell this software and its
  9. documentation for any purpose is hereby granted without fee, provided that
  10. the above copyright notice appear in all copies and that both that
  11. copyright notice and this permission notice appear in supporting
  12. documentation, and that the name of M.I.T. not be used in advertising or
  13. publicity pertaining to distribution of the software without specific,
  14. written prior permission.  M.I.T. makes no representations about the
  15. suitability of this software for any purpose.  It is provided "as is"
  16. without express or implied warranty.
  17. ******************************************************************************/
  18.  
  19. #include "PEXlib.h"
  20. #include "PEXlibint.h"
  21.  
  22. #define CHECK_AND_FREE(_ptr) if (_ptr) PEXFreeBuf (_ptr)
  23.  
  24.  
  25. void PEXFreeEnumInfo (numCounts, infoCount, enumInfo)
  26.  
  27. INPUT unsigned long     numCounts;
  28. INPUT unsigned long     *infoCount;
  29. INPUT PEXEnumTypeDesc     *enumInfo;
  30.  
  31. {
  32.     PEXEnumTypeDesc    *desc = enumInfo;
  33.     int            i, j;
  34.  
  35.  
  36.     for (i = 0; i < numCounts; i++)
  37.     for (j = 0; j < infoCount[i]; j++)
  38.     {
  39.         CHECK_AND_FREE ((char *) desc->descriptor);
  40.         desc++;
  41.     }
  42.  
  43.     CHECK_AND_FREE ((char *) infoCount);
  44.     CHECK_AND_FREE ((char *) enumInfo);
  45. }
  46.  
  47.  
  48. void PEXFreeFontInfo (numFontInfo, fontInfo)
  49.  
  50. INPUT unsigned long    numFontInfo;
  51. INPUT PEXFontInfo    *fontInfo;
  52.  
  53. {
  54.     PEXFontInfo        *info = fontInfo;
  55.     int            i;
  56.  
  57.  
  58.     for (i = 0; i < numFontInfo; i++)
  59.     {
  60.     CHECK_AND_FREE ((char *) info->props);
  61.     info++;
  62.     }
  63.  
  64.     CHECK_AND_FREE ((char *) fontInfo);
  65. }
  66.  
  67.  
  68. void PEXFreeFontNames (numFontNames, fontNames)
  69.  
  70. INPUT unsigned long    numFontNames;
  71. INPUT char        **fontNames;
  72.  
  73. {
  74.     int i;
  75.  
  76.  
  77.     for (i = 0; i < numFontNames; i++)
  78.     CHECK_AND_FREE (fontNames[i]);
  79.  
  80.     CHECK_AND_FREE ((char *) fontNames);
  81. }
  82.  
  83.  
  84. void PEXFreePCAttributes (pcAttr)
  85.  
  86. INPUT PEXPCAttributes    *pcAttr;
  87.  
  88. {
  89.     CHECK_AND_FREE ((char *) pcAttr->model_clip_volume.half_spaces);
  90.     CHECK_AND_FREE ((char *) pcAttr->light_state.indices);
  91.  
  92.     if (pcAttr->para_surf_char.type == PEXPSCMCLevelCurves ||
  93.         pcAttr->para_surf_char.type == PEXPSCWCLevelCurves)
  94.     {
  95.     CHECK_AND_FREE ((char *)
  96.         pcAttr->para_surf_char.psc.level_curves.parameters);
  97.     }
  98.     else if (pcAttr->para_surf_char.type == PEXPSCImpDep)
  99.     {
  100.     CHECK_AND_FREE ((char *) pcAttr->para_surf_char.psc.imp_dep.data);
  101.     }
  102.  
  103.     CHECK_AND_FREE ((char *) pcAttr);
  104. }
  105.  
  106.  
  107. void PEXFreePDAttributes (pdAttr)
  108.  
  109. PEXPDAttributes        *pdAttr;
  110.  
  111. {
  112.     CHECK_AND_FREE (pdAttr->path.elements);
  113.  
  114.     CHECK_AND_FREE ((char *) pdAttr);
  115. }
  116.  
  117.  
  118. void PEXFreePMAttributes (pmAttr)
  119.  
  120. PEXPMAttributes     *pmAttr;
  121.  
  122. {
  123.     CHECK_AND_FREE ((char *) pmAttr->pick_path.elements);
  124.  
  125.     CHECK_AND_FREE ((char *) pmAttr);
  126. }
  127.  
  128.  
  129. void PEXFreePickPaths (numPickPaths, pickPaths)
  130.  
  131. INPUT unsigned long    numPickPaths;
  132. INPUT PEXPickPath    *pickPaths;
  133.  
  134. {
  135.     int total_size, i;
  136.  
  137.  
  138.     /*
  139.      * Note that memory allocation of pick paths is optimized by
  140.      * allocating one chunk for all the pick paths in the list, instead
  141.      * of allocating a seperate buffer for each pick path.
  142.      */
  143.  
  144.     if (pickPaths == PEXPickCache)
  145.     {
  146.     /*
  147.      * Make the pick cache available again.
  148.      */
  149.  
  150.     PEXPickCacheInUse = 0;
  151.     }
  152.     else if (PEXPickCacheInUse)
  153.     {
  154.     /*
  155.      * The pick cache is in use, so we must free this pick path.
  156.      */
  157.  
  158.     PEXFreeBuf ((char *) pickPaths);
  159.     }
  160.     else
  161.     {
  162.     /*
  163.      * Calculate the size of the pick path being freed.
  164.      */
  165.  
  166.     total_size = numPickPaths * sizeof (PEXPickPath);
  167.     for (i = 0; i < numPickPaths; i++)
  168.         total_size += (pickPaths[i].count * sizeof (PEXPickElementRef));
  169.  
  170.  
  171.     /*
  172.      * If the size is smaller than the pick cache size or bigger than
  173.      * the max size, free the pick path.  Otherwise, make this path the
  174.      * new pick cache buffer.
  175.      */
  176.     
  177.     if (total_size <= PEXPickCacheSize || total_size > MAX_PICK_CACHE_SIZE)
  178.         PEXFreeBuf ((char *) pickPaths);
  179.     else
  180.     {
  181.         if (PEXPickCache)
  182.         PEXFreeBuf ((char *) PEXPickCache);
  183.         PEXPickCache = pickPaths;
  184.         PEXPickCacheSize = total_size;
  185.     }
  186.     }
  187. }
  188.  
  189.  
  190. void PEXFreeRendererAttributes (rdrAttr)
  191.  
  192. INPUT PEXRendererAttributes    *rdrAttr;
  193.  
  194. {
  195.     CHECK_AND_FREE ((char *) rdrAttr->current_path.elements);
  196.     CHECK_AND_FREE ((char *) rdrAttr->clip_list.rectangles);
  197.     CHECK_AND_FREE ((char *) rdrAttr->pick_start_path.elements);
  198.  
  199.     CHECK_AND_FREE ((char *) rdrAttr);
  200. }
  201.  
  202.  
  203. void PEXFreeSCAttributes (scAttr)
  204.  
  205. PEXSCAttributes        *scAttr;
  206.  
  207. {
  208.     CHECK_AND_FREE ((char *) scAttr->start_path.elements);
  209.     CHECK_AND_FREE ((char *) scAttr->normal.pairs);
  210.     CHECK_AND_FREE ((char *) scAttr->inverted.pairs);
  211.  
  212.     CHECK_AND_FREE ((char *) scAttr);
  213. }
  214.  
  215.  
  216. void PEXFreeStructurePaths (numPaths, paths)
  217.  
  218. INPUT unsigned long    numPaths;
  219. INPUT PEXStructurePath    *paths;
  220.  
  221. {
  222.     int i;
  223.  
  224.  
  225.     for (i = 0; i < numPaths; i++)
  226.     CHECK_AND_FREE ((char *) paths[i].elements);
  227.  
  228.     CHECK_AND_FREE ((char *) paths);
  229. }
  230.  
  231.  
  232. void PEXFreeTableEntries (tableType, numTableEntries, tableEntries)
  233.  
  234. INPUT int        tableType;
  235. INPUT unsigned int    numTableEntries;
  236. INPUT PEXPointer    tableEntries;
  237.  
  238. {
  239.     int     i;
  240.     
  241.  
  242.     switch (tableType)
  243.     {
  244.     case PEXLUTPattern:
  245.     {
  246.     PEXPatternEntry *entries = (PEXPatternEntry *) tableEntries;
  247.     
  248.     for (i = 0; i < numTableEntries; i++)
  249.         CHECK_AND_FREE ((char *) entries[i].colors.indexed);
  250.     break;
  251.     }
  252.     
  253.     case PEXLUTTextFont:
  254.     {
  255.     PEXTextFontEntry *entries = (PEXTextFontEntry *) tableEntries;
  256.     
  257.     for (i = 0; i < numTableEntries; i++)
  258.         CHECK_AND_FREE ((char *) entries[i].fonts);
  259.     break;
  260.     }
  261.  
  262.     case PEXLUTLineBundle:
  263.     case PEXLUTMarkerBundle:
  264.     case PEXLUTTextBundle:
  265.     case PEXLUTInteriorBundle:
  266.     case PEXLUTEdgeBundle:
  267.     case PEXLUTColor:
  268.     case PEXLUTView:
  269.     case PEXLUTLight:
  270.     case PEXLUTDepthCue:
  271.     case PEXLUTColorApprox:
  272.         break;
  273.     }
  274. }
  275.  
  276.  
  277. void PEXFreeWorkstationAttributes (wksAttr)
  278.  
  279. INPUT PEXWorkstationAttributes    *wksAttr;
  280.  
  281. {
  282.     CHECK_AND_FREE ((char *) wksAttr->defined_views.views);
  283.     CHECK_AND_FREE ((char *) wksAttr->posted_structures.structures);
  284.  
  285.     CHECK_AND_FREE ((char *) wksAttr);
  286. }
  287.  
  288.  
  289. void PEXFreeOCData (count, oc_data)
  290.  
  291. INPUT unsigned long    count;
  292. INPUT PEXOCData        *oc_data;
  293.  
  294. {
  295.     PEXOCData        *oc = oc_data;
  296.     PEXEncodedTextData     *encText;
  297.     PEXListOfVertex    *plset;
  298.     PEXListOfCoord    *fillset;
  299.     PEXListOfCoord2D    *fillset2D;
  300.     PEXListOfVertex    *fillsetdata;
  301.     PEXConnectivityData    *pCon;
  302.     PEXListOfTrimCurve    *pTrim;
  303.     int         i, j, k;
  304.  
  305.  
  306.     for (i = 0; i < count; i++, oc++)
  307.     {
  308.     switch (oc->oc_type)
  309.     {
  310.     case PEXOCModelClipVolume:
  311.  
  312.         CHECK_AND_FREE ((char *) oc->data.SetModelClipVolume.half_spaces);
  313.         break;
  314.  
  315.     case PEXOCModelClipVolume2D:
  316.  
  317.         CHECK_AND_FREE ((char *) oc->data.SetModelClipVolume2D.half_spaces);
  318.         break;
  319.  
  320.     case PEXOCLightSourceState:
  321.  
  322.         CHECK_AND_FREE ((char *) oc->data.SetLightSourceState.enable);
  323.         CHECK_AND_FREE ((char *) oc->data.SetLightSourceState.disable);
  324.         break;
  325.  
  326.     case PEXOCParaSurfCharacteristics:
  327.  
  328.         if (oc->data.SetParaSurfCharacteristics.psc_type ==
  329.         PEXPSCMCLevelCurves ||
  330.                 oc->data.SetParaSurfCharacteristics.psc_type ==
  331.         PEXPSCWCLevelCurves)
  332.         CHECK_AND_FREE ((char *) oc->data.SetParaSurfCharacteristics.characteristics.level_curves.parameters);
  333.         break;
  334.  
  335.     case PEXOCAddToNameSet:
  336.  
  337.         CHECK_AND_FREE ((char *) oc->data.AddToNameSet.names);
  338.         break;
  339.  
  340.     case PEXOCRemoveFromNameSet:
  341.  
  342.         CHECK_AND_FREE ((char *) oc->data.RemoveFromNameSet.names);
  343.         break;
  344.  
  345.     case PEXOCApplicationData:
  346.  
  347.         CHECK_AND_FREE ((char *) oc->data.ApplicationData.data);
  348.         break;
  349.  
  350.     case PEXOCGSE:
  351.  
  352.         CHECK_AND_FREE ((char *) oc->data.GSE.data);
  353.         break;
  354.  
  355.     case PEXOCMarkers:
  356.  
  357.         CHECK_AND_FREE ((char *) oc->data.Markers.points);
  358.         break;
  359.  
  360.     case PEXOCMarkers2D:
  361.  
  362.         CHECK_AND_FREE ((char *) oc->data.Markers2D.points);
  363.         break;
  364.  
  365.     case PEXOCPolyline:
  366.  
  367.         CHECK_AND_FREE ((char *) oc->data.Polyline.points);
  368.         break;
  369.  
  370.     case PEXOCPolyline2D:
  371.  
  372.         CHECK_AND_FREE ((char *) oc->data.Polyline2D.points);
  373.         break;
  374.  
  375.     case PEXOCText:
  376.  
  377.         encText = oc->data.EncodedText.encoded_text;
  378.         for (j = 0; j < oc->data.EncodedText.count; j++, encText++)
  379.         CHECK_AND_FREE ((char *) encText->ch);
  380.         CHECK_AND_FREE ((char *) oc->data.EncodedText.encoded_text);
  381.         break;
  382.  
  383.     case PEXOCText2D:
  384.  
  385.         encText = oc->data.EncodedText2D.encoded_text;
  386.         for (j = 0; j < oc->data.EncodedText2D.count; j++, encText++)
  387.         CHECK_AND_FREE ((char *) encText->ch);
  388.         CHECK_AND_FREE ((char *) oc->data.EncodedText2D.encoded_text);
  389.         break;
  390.  
  391.     case PEXOCAnnotationText:
  392.  
  393.         encText = oc->data.EncodedAnnoText.encoded_text;
  394.         for (j = 0; j < oc->data.EncodedAnnoText.count; j++, encText++)
  395.         CHECK_AND_FREE ((char *) encText->ch);
  396.         CHECK_AND_FREE ((char *) oc->data.EncodedAnnoText.encoded_text);
  397.         break;
  398.  
  399.     case PEXOCAnnotationText2D:
  400.  
  401.         encText = oc->data.EncodedAnnoText2D.encoded_text;
  402.         for (j = 0; j < oc->data.EncodedAnnoText2D.count; j++, encText++)
  403.         CHECK_AND_FREE ((char *) encText->ch);
  404.         CHECK_AND_FREE ((char *) oc->data.EncodedAnnoText2D.encoded_text);
  405.         break;
  406.  
  407.     case PEXOCPolylineSetWithData:
  408.  
  409.         plset = oc->data.PolylineSetWithData.vertex_lists;
  410.         for (j = 0; j < oc->data.PolylineSetWithData.count; j++, plset++)
  411.         {
  412.         CHECK_AND_FREE ((char *) plset->vertices.no_data);
  413.         }
  414.         CHECK_AND_FREE ((char *) oc->data.PolylineSetWithData.vertex_lists);
  415.         break;
  416.  
  417.     case PEXOCNURBCurve:
  418.  
  419.         CHECK_AND_FREE ((char *) oc->data.NURBCurve.knots);
  420.         CHECK_AND_FREE ((char *) oc->data.NURBCurve.points.point);
  421.         break;
  422.  
  423.     case PEXOCFillArea:
  424.  
  425.         CHECK_AND_FREE ((char *) oc->data.FillArea.points);
  426.         break;
  427.  
  428.     case PEXOCFillArea2D:
  429.  
  430.         CHECK_AND_FREE ((char *) oc->data.FillArea2D.points);
  431.         break;
  432.  
  433.     case PEXOCFillAreaWithData:
  434.  
  435.         CHECK_AND_FREE ((char *)
  436.         oc->data.FillAreaWithData.vertices.no_data);
  437.         break;
  438.  
  439.     case PEXOCFillAreaSet:
  440.  
  441.         fillset = oc->data.FillAreaSet.point_lists;
  442.         for (j = 0; j < oc->data.FillAreaSet.count; j++, fillset++)
  443.         {
  444.         CHECK_AND_FREE ((char *) fillset->points);
  445.         }
  446.         CHECK_AND_FREE ((char *) oc->data.FillAreaSet.point_lists);
  447.         break;
  448.  
  449.     case PEXOCFillAreaSet2D:
  450.  
  451.         fillset2D = oc->data.FillAreaSet2D.point_lists;
  452.         for (j = 0; j < oc->data.FillAreaSet2D.count; j++, fillset2D++)
  453.         {
  454.         CHECK_AND_FREE ((char *) fillset2D->points);
  455.         }
  456.         CHECK_AND_FREE ((char *) oc->data.FillAreaSet2D.point_lists);
  457.         break;
  458.  
  459.     case PEXOCFillAreaSetWithData:
  460.  
  461.         fillsetdata = oc->data.FillAreaSetWithData.vertex_lists;
  462.         for (j = 0; j < oc->data.FillAreaSetWithData.count;
  463.         j++, fillsetdata++)
  464.         {
  465.         CHECK_AND_FREE ((char *) fillsetdata->vertices.no_data);
  466.         }
  467.         CHECK_AND_FREE ((char *) oc->data.FillAreaSetWithData.vertex_lists);
  468.         break;
  469.  
  470.     case PEXOCTriangleStrip:
  471.  
  472.         CHECK_AND_FREE ((char *) oc->data.TriangleStrip.facet_data.index);
  473.         CHECK_AND_FREE ((char *) oc-> data.TriangleStrip.vertices.no_data);
  474.         break;
  475.  
  476.     case PEXOCQuadrilateralMesh:
  477.  
  478.         CHECK_AND_FREE ((char *)
  479.         oc->data.QuadrilateralMesh.facet_data.index);
  480.         CHECK_AND_FREE ((char *)
  481.         oc->data.QuadrilateralMesh.vertices.no_data);
  482.         break;
  483.  
  484.     case PEXOCSetOfFillAreaSets:
  485.  
  486.         CHECK_AND_FREE ((char *)
  487.         oc->data.SetOfFillAreaSets.facet_data.index);
  488.         CHECK_AND_FREE ((char *)
  489.         oc->data.SetOfFillAreaSets.vertices.no_data);
  490.         CHECK_AND_FREE ((char *) oc->data.SetOfFillAreaSets.edge_flags);
  491.  
  492.         pCon = oc->data.SetOfFillAreaSets.connectivity;
  493.         for (j = 0; j < oc->data.SetOfFillAreaSets.set_count; j++, pCon++)
  494.         {
  495.         for (k = 0; k < (int) pCon->count; k++)
  496.             CHECK_AND_FREE ((char *) pCon->lists[k].shorts);
  497.         CHECK_AND_FREE ((char *) pCon->lists);
  498.         }
  499.         CHECK_AND_FREE ((char *) oc->data.SetOfFillAreaSets.connectivity);
  500.         break;
  501.  
  502.     case PEXOCNURBSurface:
  503.        
  504.         CHECK_AND_FREE ((char *) oc->data.NURBSurface.uknots);
  505.         CHECK_AND_FREE ((char *) oc->data.NURBSurface.vknots);
  506.         CHECK_AND_FREE ((char *) oc->data.NURBSurface.points.point);
  507.         
  508.         pTrim = oc->data.NURBSurface.trim_curves;
  509.         for (j = 0; j < oc->data.NURBSurface.curve_count; j++, pTrim++)
  510.         {
  511.         for (k = 0; k < (int) pTrim->count; k++)
  512.         {
  513.             CHECK_AND_FREE ((char *) pTrim->curves[k].knots.floats);
  514.             CHECK_AND_FREE ((char *)
  515.             pTrim->curves[k].control_points.point);
  516.         }
  517.         CHECK_AND_FREE ((char *) pTrim->curves);
  518.         }
  519.         CHECK_AND_FREE ((char *) oc->data.NURBSurface.trim_curves);
  520.         break;
  521.  
  522.     case PEXOCCellArray:
  523.  
  524.         CHECK_AND_FREE ((char *) oc->data.CellArray.color_indices);
  525.         break;
  526.  
  527.     case PEXOCCellArray2D:
  528.  
  529.         CHECK_AND_FREE ((char *) oc->data.CellArray2D.color_indices);
  530.         break;
  531.  
  532.     case PEXOCExtendedCellArray:
  533.  
  534.         CHECK_AND_FREE ((char *) oc->data.ExtendedCellArray.colors.indexed);
  535.         break;
  536.  
  537.     default:
  538.         break;
  539.     }
  540.     }
  541.  
  542.     CHECK_AND_FREE ((char *) oc_data);
  543. }
  544.