/** * @brief Allocate a node into the UI memory * @note It's not a dynamic memory allocation. Please only use it at the loading time * @todo Assert out when we are not in parsing/loading stage * @param[in] name Name of the new node, else nullptr if we don't want to edit it. * @param[in] type Name of the node behavior * @param[in] isDynamic Allocate a node in static or dynamic memory * @todo This method can be merged with UI_AllocNodeWithoutNew. Since all nodes are dynamic, there is no * real reason to distinguish between types of allocation. */ uiNode_t* UI_AllocNode (const char* name, const char* type, bool isDynamic) { uiNode_t* node = UI_AllocNodeWithoutNew(name, type, isDynamic); /* default initializtion */ UI_Node_InitNode(node); /* allocate memory */ if (node->dynamic) { UI_Node_InitNodeDynamic(node); } /* initialize default properties */ UI_Node_Loading(node); return node; }
/** * @brief Allocate a node into the UI memory (do not call behaviour->new) * @note It's not a dynamic memory allocation. Please only use it at the loading time * @todo Assert out when we are not in parsing/loading stage * @param[in] name Name of the new node, else nullptr if we don't want to edit it. * @param[in] type Name of the node behavior * @param[in] isDynamic Allocate a node in static or dynamic memory */ static uiNode_t* UI_AllocNodeWithoutNew (const char* name, const char* type, bool isDynamic) { uiNode_t* node; uiBehaviour_t *behaviour; int nodeSize; behaviour = UI_GetNodeBehaviour(type); if (behaviour == nullptr) Com_Error(ERR_FATAL, "UI_AllocNodeWithoutNew: Node behaviour '%s' doesn't exist", type); nodeSize = sizeof(*node) + behaviour->extraDataSize; if (!isDynamic) { void *memory = UI_AllocHunkMemory(nodeSize, STRUCT_MEMORY_ALIGN, true); if (memory == nullptr) Com_Error(ERR_FATAL, "UI_AllocNodeWithoutNew: No more memory to allocate a new node - increase the cvar ui_hunksize"); node = static_cast<uiNode_t*>(memory); ui_global.numNodes++; } else { node = static_cast<uiNode_t*>(Mem_PoolAlloc(nodeSize, ui_dynPool, 0)); node->dynamic = true; } node->behaviour = behaviour; #ifdef DEBUG UI_Node_DebugCountWidget(node, 1); #endif if (UI_Node_IsAbstract(node)) Com_Error(ERR_FATAL, "UI_AllocNodeWithoutNew: Node behavior '%s' is abstract. We can't instantiate it.", type); if (name != nullptr) { Q_strncpyz(node->name, name, sizeof(node->name)); if (strlen(node->name) != strlen(name)) Com_Printf("UI_AllocNodeWithoutNew: Node name \"%s\" truncated. New name is \"%s\"\n", name, node->name); } /* initialize default properties */ UI_Node_Loading(node); return node; }