|
5 | 5 |
|
6 | 6 | #include <iostream> |
7 | 7 | #include <memory> |
| 8 | +#include <regex> |
8 | 9 |
|
9 | 10 | #include <OpenImageIO/half.h> |
10 | 11 |
|
@@ -169,6 +170,8 @@ class ImageBufImpl { |
169 | 170 | void* progress_callback_data = nullptr, |
170 | 171 | DoLock do_lock = DoLock(true)); |
171 | 172 | void copy_metadata(const ImageBufImpl& src); |
| 173 | + void merge_metadata(const ImageBufImpl& src, bool override = false, |
| 174 | + string_view pattern = {}); |
172 | 175 |
|
173 | 176 | // At least one of bufspan or buforigin is supplied. Set this->m_bufspan |
174 | 177 | // and this->m_localpixels appropriately. |
@@ -1774,6 +1777,55 @@ ImageBuf::copy_metadata(const ImageBuf& src) |
1774 | 1777 |
|
1775 | 1778 |
|
1776 | 1779 |
|
| 1780 | +void |
| 1781 | +ImageBufImpl::merge_metadata(const ImageBufImpl& src, bool override, |
| 1782 | + string_view pattern) |
| 1783 | +{ |
| 1784 | + ImageSpec& myspec(this->specmod()); |
| 1785 | + const ImageSpec& srcspec(src.spec()); |
| 1786 | + std::regex re(std::string(pattern), std::regex_constants::basic); |
| 1787 | + for (const auto& a : srcspec.extra_attribs) { |
| 1788 | + if ((pattern.empty() || std::regex_search(a.name().string(), re)) |
| 1789 | + && (override || !myspec.extra_attribs.contains(a.name()))) |
| 1790 | + myspec.attribute(a.name(), a.type(), a.data()); |
| 1791 | + } |
| 1792 | + |
| 1793 | + if (override) { |
| 1794 | + if (pattern.empty() || std::regex_search("full_geom", re)) { |
| 1795 | + m_spec.full_x = srcspec.full_x; |
| 1796 | + m_spec.full_y = srcspec.full_y; |
| 1797 | + m_spec.full_z = srcspec.full_z; |
| 1798 | + m_spec.full_width = srcspec.full_width; |
| 1799 | + m_spec.full_height = srcspec.full_height; |
| 1800 | + m_spec.full_depth = srcspec.full_depth; |
| 1801 | + } |
| 1802 | + if (pattern.empty() || std::regex_search("tile_size", re)) { |
| 1803 | + if (src.storage() == ImageBuf::IMAGECACHE) { |
| 1804 | + // If we're copying metadata from a cached image, be sure to |
| 1805 | + // get the file's tile size, not the cache's tile size. |
| 1806 | + m_spec.tile_width = src.nativespec().tile_width; |
| 1807 | + m_spec.tile_height = src.nativespec().tile_height; |
| 1808 | + m_spec.tile_depth = src.nativespec().tile_depth; |
| 1809 | + } else { |
| 1810 | + m_spec.tile_width = srcspec.tile_width; |
| 1811 | + m_spec.tile_height = srcspec.tile_height; |
| 1812 | + m_spec.tile_depth = srcspec.tile_depth; |
| 1813 | + } |
| 1814 | + } |
| 1815 | + } |
| 1816 | +} |
| 1817 | + |
| 1818 | + |
| 1819 | + |
| 1820 | +void |
| 1821 | +ImageBuf::merge_metadata(const ImageBuf& src, bool override, |
| 1822 | + string_view pattern) |
| 1823 | +{ |
| 1824 | + m_impl->merge_metadata(*src.m_impl, override, pattern); |
| 1825 | +} |
| 1826 | + |
| 1827 | + |
| 1828 | + |
1777 | 1829 | const ImageSpec& |
1778 | 1830 | ImageBuf::spec() const |
1779 | 1831 | { |
|
0 commit comments