33
44#include < iostream>
55#include < vector>
6+ #include < algorithm>
7+ #include < string>
8+ #include < cctype>
69
710BBFBuilder::BBFBuilder (const std::string& outputFilename) : currentOffset(0 )
811{
@@ -22,7 +25,9 @@ BBFBuilder::BBFBuilder(const std::string& outputFilename) : currentOffset(0)
2225 header.magic [1 ] = ' B' ;
2326 header.magic [2 ] = ' F' ;
2427 header.magic [3 ] = ' 1' ;
25- header.version = 1 ;
28+ header.version = 2 ;
29+ header.flags = 0 ; // reserved for now as well.
30+ header.headerLen = sizeof (BBFHeader);
2631 header.reserved = 0 ; // Reserved for future expansions
2732
2833 // Write the header
@@ -92,16 +97,19 @@ bool BBFBuilder::addPage(const std::string& imagePath, uint8_t type, uint32_t fl
9297 // No dupe found. create a new asset.
9398 alignPadding (); // start by allocating necessary padding.
9499
95- BBFAssetEntry newAsset;
100+ BBFAssetEntry newAsset = { 0 } ;
96101 newAsset.offset = currentOffset;
97102 newAsset.length = size;
103+ newAsset.decodedLength = size;
98104 newAsset.xxh3Hash = hash;
99105 newAsset.type = type;
106+ newAsset.flags = 0 ; // no flags yet.
100107
101- for ( int i = 0 ; i < 7 ; i++ )
102- {
103- newAsset.reserved [i] = 0 ; // Add in the reserved bytes.
104- }
108+ // set reserved equal to zero
109+ // newAsset.reserved[4] = {0};
110+
111+ // same for padding
112+ // newAsset.padding[7] = {0};
105113
106114 fileStream.write (buffer.data (), size);
107115 currentOffset += size;
@@ -160,8 +168,6 @@ bool BBFBuilder::addMetadata(const std::string& key, const std::string& value)
160168
161169bool BBFBuilder::finalize ()
162170{
163- uint64_t indexStart = currentOffset;
164-
165171 // Initialize XXH3 State
166172 XXH3_state_t* const state = XXH3_createState ();
167173 if (state == nullptr ) return false ;
@@ -178,6 +184,7 @@ bool BBFBuilder::finalize()
178184 // write footer
179185 BBFFooter footer;
180186 footer.stringPoolOffset = currentOffset;
187+ footer.extraOffset = 0 ; // set the extraOffset to 0 since we aren't using it.
181188
182189 // fileStream.write(stringPool.data(), stringPool.size());
183190 // currentOffset += stringPool.size();
@@ -230,4 +237,42 @@ bool BBFBuilder::finalize()
230237 fileStream.write (reinterpret_cast <char *>(&footer), sizeof (BBFFooter));
231238 fileStream.close ();
232239 return true ;
240+ }
241+
242+ BBFMediaType detectTypeFromExtension (const std::string &extension)
243+ {
244+ std::string ext = extension;
245+ std::transform (ext.begin (), ext.end (), ext.begin (), ::tolower);
246+
247+ if (ext == " .png" ) return BBFMediaType::PNG ;
248+ if (ext == " .jpg" || ext == " .jpeg" ) return BBFMediaType::JPG ;
249+ if (ext == " .avif" ) return BBFMediaType::AVIF ;
250+ if (ext == " .webp" ) return BBFMediaType::WEBP ;
251+ if (ext == " .jxl" ) return BBFMediaType::JXL ;
252+ if (ext == " .bmp" ) return BBFMediaType::BMP ;
253+ if (ext == " .gif" ) return BBFMediaType::GIF ;
254+ if (ext == " .tiff" ) return BBFMediaType::TIFF ;
255+
256+ return BBFMediaType::UNKNOWN ;
257+ }
258+
259+ std::string MediaTypeToStr (uint8_t type)
260+ {
261+ BBFMediaType mediaType = static_cast <BBFMediaType>(type);
262+
263+ switch (mediaType)
264+ {
265+ case BBFMediaType::AVIF : return " .avif" ;
266+ case BBFMediaType::PNG : return " .png" ;
267+ case BBFMediaType::JPG : return " .jpg" ;
268+ case BBFMediaType::WEBP : return " .webp" ;
269+ case BBFMediaType::JXL : return " .jxl" ;
270+ case BBFMediaType::BMP : return " .bmp" ;
271+ case BBFMediaType::GIF : return " .gif" ;
272+ case BBFMediaType::TIFF : return " .tiff" ;
273+
274+ case BBFMediaType::UNKNOWN :
275+ default :
276+ return " .png" ;
277+ }
233278}
0 commit comments