| 420 | } // IptcParser::decode |
| 421 | |
| 422 | DataBuf 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 | |