/* * Copyright 2006, 2023, Haiku. All rights reserved. * Distributed under the terms of the MIT License. * * Authors: * Stephan Aßmus * Zardshard */ #include "FlatIconImporter.h" #include #include #include #include #include #include "AffineTransformer.h" #include "AutoDeleter.h" #include "ContourTransformer.h" #include "FlatIconFormat.h" #include "GradientTransformable.h" #include "Icon.h" #include "LittleEndianBuffer.h" #include "PathCommandQueue.h" #include "PathSourceShape.h" #include "PerspectiveTransformer.h" #include "Shape.h" #include "StrokeTransformer.h" #include "Style.h" #include "VectorPath.h" using std::nothrow; _USING_ICON_NAMESPACE // constructor FlatIconImporter::FlatIconImporter() #ifdef ICON_O_MATIC : Importer() #endif { } // destructor FlatIconImporter::~FlatIconImporter() { } // Import status_t FlatIconImporter::Import(Icon* icon, BPositionIO* stream) { #ifdef ICON_O_MATIC status_t ret = Init(icon); if (ret < B_OK) return ret; #else status_t ret; #endif // seek around in the stream to figure out the size off_t size = stream->Seek(0, SEEK_END); if (stream->Seek(0, SEEK_SET) != 0) return B_ERROR; // we chicken out on anything larger than 256k if (size <= 0 || size > 256 * 1024) return B_BAD_VALUE; // read the entire stream into a buffer LittleEndianBuffer buffer(size); if (!buffer.Buffer()) return B_NO_MEMORY; if (stream->Read(buffer.Buffer(), size) != size) return B_ERROR; ret = _ParseSections(buffer, icon); return ret; } // Import status_t FlatIconImporter::Import(Icon* icon, uint8* _buffer, size_t size) { #ifdef ICON_O_MATIC status_t ret = Init(icon); if (ret < B_OK) return ret; #endif if (!_buffer) return B_BAD_VALUE; // attach LittleEndianBuffer to buffer LittleEndianBuffer buffer(_buffer, size); return _ParseSections(buffer, icon); } // #pragma mark - // _ParseSections status_t FlatIconImporter::_ParseSections(LittleEndianBuffer& buffer, Icon* icon) { // test if this is an icon at all uint32 magic; if (!buffer.Read(magic) || magic != FLAT_ICON_MAGIC) return B_BAD_TYPE; // styles Container