MCPcopy Create free account
hub / github.com/Exiv2/exiv2 / encode

Method encode

src/iptc.cpp:422–457  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

420} // IptcParser::decode
421
422DataBuf IptcParser::encode(const IptcData& iptcData) {
423 if (iptcData.empty())
424 return {};
425
426 DataBuf buf(iptcData.size());
427 byte* pWrite = buf.data();
428
429 // Copy the iptc data sets and sort them by record but preserve the order of datasets
430 IptcMetadata sortedIptcData;
431 std::copy(iptcData.begin(), iptcData.end(), std::back_inserter(sortedIptcData));
432 std::stable_sort(sortedIptcData.begin(), sortedIptcData.end(),
433 [](const auto& l, const auto& r) { return l.record() < r.record(); });
434
435 for (const auto& iter : sortedIptcData) {
436 // marker, record Id, dataset num
437 *pWrite++ = marker_;
438 *pWrite++ = static_cast<byte>(iter.record());
439 *pWrite++ = static_cast<byte>(iter.tag());
440
441 // extended or standard dataset?
442 if (size_t dataSize = iter.size(); dataSize > 32767) {
443 // always use 4 bytes for extended length
444 uint16_t sizeOfSize = 4 | 0x8000;
445 us2Data(pWrite, sizeOfSize, bigEndian);
446 pWrite += 2;
447 ul2Data(pWrite, static_cast<uint32_t>(dataSize), bigEndian);
448 pWrite += 4;
449 } else {
450 us2Data(pWrite, static_cast<uint16_t>(dataSize), bigEndian);
451 pWrite += 2;
452 }
453 pWrite += iter.value().copy(pWrite, bigEndian);
454 }
455
456 return buf;
457} // IptcParser::encode
458
459} // namespace Exiv2
460

Callers

nothing calls this directly

Calls 10

us2DataFunction · 0.85
ul2DataFunction · 0.85
dataMethod · 0.80
emptyMethod · 0.45
sizeMethod · 0.45
beginMethod · 0.45
endMethod · 0.45
recordMethod · 0.45
tagMethod · 0.45
copyMethod · 0.45

Tested by

no test coverage detected