Ejemplo n.º 1
0
void encodeNode(HuffmanNode* node, obitstream& output) {
    if (node->isLeaf()) {
        output.writeBit(1);
        output.put(node->character);
    } else {
        output.writeBit(0);
        encodeNode(node->zero, output);
        encodeNode(node->one, output);
    }
}
Ejemplo n.º 2
0
void Huffman::startHuffman(map<char32_t, int>& letters, BitOutput*& writer, map<char32_t, string> &huffmanCodes) {
    struct Node* left, * right, * top;

    priority_queue<Node*, vector<Node*>, compare> queue;

    for (auto it = letters.begin(); it != letters.end(); ++it) {
        queue.push(new Node(it->first, it->second));

        countOfOperations += 1;
    }

    while (queue.size() != 1) {
        left = queue.top();
        queue.pop();

        right = queue.top();
        queue.pop();

        top = new Node(0, left->freq + right->freq);
        top->left = left;
        top->right = right;
        queue.push(top);

        countOfOperations += 9;
    }

    root = queue.top();
    makeCodes(root, "", huffmanCodes);
    encodeNode(root, writer);

    countOfOperations += 7;
}
Ejemplo n.º 3
0
void Huffman::encodeNode(Node* node, BitOutput*& writer) {
    if (node->isLeafNode()) {
        (*writer).writeBit(1);
        (*writer).writeChar32(node->data);

        countOfOperations += 2;
    } else {
        (*writer).writeBit(0);

        encodeNode(node->left, writer);
        encodeNode(node->right, writer);

        countOfOperations += 3;
    }

    countOfOperations += 1;
}
Ejemplo n.º 4
0
void FBXWriter::encodeNode(QDataStream& out, const FBXNode& node) {
    auto device = out.device();
    auto nodeStartPos = device->pos();

    // endOffset (temporary, updated later)
    out << (FBXEndOffset)0;

    // Property count
    out << (FBXPropertyCount)node.properties.size();

    // Property list length (temporary, updated later)
    out << (FBXListLength)0;

    out << (quint8)node.name.size();
    out.writeRawData(node.name, node.name.size());

    auto nodePropertiesStartPos = device->pos();

    for (const auto& prop : node.properties) {
        encodeFBXProperty(out, prop);
    }

    // Go back and write property list length
    auto nodePropertiesEndPos = device->pos();
    device->seek(nodeStartPos + sizeof(FBXEndOffset) + sizeof(FBXPropertyCount));
    out << (FBXListLength)(nodePropertiesEndPos - nodePropertiesStartPos);

    device->seek(nodePropertiesEndPos);

    for (auto& child : node.children) {
        encodeNode(out, child);
    }

    if (node.children.length() > 0) {
        encodeNode(out, FBXNode());
    }

    // Go back and write actual endOffset
    auto nodeEndPos = device->pos();
    device->seek(nodeStartPos);
    out << (FBXEndOffset)(nodeEndPos);

    device->seek(nodeEndPos);
}
Ejemplo n.º 5
0
QByteArray FBXWriter::encodeFBX(const FBXNode& root) {
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out.setByteOrder(QDataStream::LittleEndian);
    out.setVersion(QDataStream::Qt_4_5);

    out.writeRawData(FBX_BINARY_PROLOG, FBX_BINARY_PROLOG.size());
    out.writeRawData(FBX_BINARY_PROLOG2, FBX_BINARY_PROLOG2.size());

#ifdef USE_FBX_2016_FORMAT
    out << FBX_VERSION_2016;
#else
    out << FBX_VERSION_2015;
#endif

    for (auto& child : root.children) {
        encodeNode(out, child);
    }
    encodeNode(out, FBXNode());

    return data;
}
Ejemplo n.º 6
0
 typename BVHN<N>::NodeRef BVHN<N>::layoutLargeNodesRecursion(NodeRef& node, FastAllocator::ThreadLocal& allocator)
 {
   if (node.isBarrier()) {
     node.clearBarrier();
     return node;
   }
   else if (node.isNode()) 
   {
     Node* oldnode = node.node();
     Node* newnode = (BVHN::Node*) allocator.malloc(sizeof(BVHN::Node),byteNodeAlignment);
     *newnode = *oldnode;
     for (size_t c=0; c<N; c++)
       newnode->child(c) = layoutLargeNodesRecursion(oldnode->child(c),allocator);
     return encodeNode(newnode);
   }
   else return node;
 }
Ejemplo n.º 7
0
 BVH4::NodeRef BVH4::layoutLargeNodesRecursion(NodeRef& node)
 {
   if (node.isBarrier()) {
     node.clearBarrier();
     return node;
   }
   else if (node.isNode()) 
   {
     Node* oldnode = node.node();
     Node* newnode = (BVH4::Node*) alloc.threadLocal2()->alloc0.malloc(sizeof(BVH4::Node)); // FIXME: optimize access to threadLocal2 
     *newnode = *oldnode;
     for (size_t c=0; c<BVH4::N; c++)
       newnode->child(c) = layoutLargeNodesRecursion(oldnode->child(c));
     return encodeNode(newnode);
   }
   else return node;
 }
Ejemplo n.º 8
0
void writeHeader(HuffmanNode* encodingTree, obitstream& output) {
    encodeNode(encodingTree, output);
}