Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/SDK/image.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/SDK/image.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,156 @@ +#include "foobar2000-sdk-pch.h" +#include "image.h" +#include "album_art.h" + +namespace fb2k { + bool imageSize_t::equals(imageSize_t const & v1, imageSize_t const & v2) { + return v1.width == v2.width && v1.height == v2.height; + } + bool imageSize_t::greater(const fb2k::imageSize_t &v1, const fb2k::imageSize_t &v2) { + // v1 > v2 + if (v1.width > v2.width) return true; + if (v1.width < v2.width) return false; + return v1.height > v2.height; + } + bool imageSize_t::isValid() const { + return width > 0 && height > 0; + } + + imageSize_t imageSize_t::fitIn( double longerEdge ) const { + if (!isValid() || longerEdge <= 0) return empty(); + + if (height <= longerEdge && width <= longerEdge) return *this; + + imageSize_t rv = {}; + if (width > height) { + rv.width = longerEdge; + rv.height = longerEdge * height / width; + } else { + rv.height = longerEdge; + rv.width = longerEdge * width / height; + } + return rv; + } + imageSize_t imageSize_t::fitIn( imageSize_t size ) const { + if (!isValid() || !size.isValid()) return empty(); + + if (width <= size.width && height <= size.height) return *this; + + imageSize_t rv = {}; + double ratio = size.width / size.height; + double ourRatio = width / height; + if (ratio < ourRatio) { + // fit width + rv.width = size.width; + rv.height = height * (size.width / width); + } else { + // fit height + rv.height = size.height; + rv.width = width * (size.height / height); + } + return rv; + } + + void imageSize_t::sanitize() { + if (width < 0) width = 0; + if (height < 0) height = 0; + width = pfc::rint32(width); + height = pfc::rint32(height); + } + image::ptr image::resizeToFit( imageSize_t fitInSize ) { + fitInSize.sanitize(); + imageSize_t ourSize = size(); + imageSize_t resizeTo = ourSize.fitIn(fitInSize); + if (resizeTo == ourSize || !resizeTo.isValid()) return this; + return resize( resizeTo ); + } + + + + static imageSize_t imageSizeSafe(imageRef img) { + if (img.is_valid()) return img->size(); + else return imageSize_t::empty(); + } + imageRef imageCreator::loadImageNamed2( const char * imgName, arg_t & arg ) { + auto ret = loadImageNamed( imgName, arg.inWantSize ); + arg.outRealSize = imageSizeSafe(ret); + return ret; + } + imageRef imageCreator::loadImageData2( const void * data, size_t size, stringRef sourceURL, arg_t & arg ) { + auto ret = loadImageData(data, size, sourceURL); + arg.outRealSize = imageSizeSafe(ret); + return ret; + } + imageRef imageCreator::loadImageData2(memBlockRef block, stringRef sourceURL, arg_t & arg) { + auto ret = loadImageData(block, sourceURL); + arg.outRealSize = imageSizeSafe(ret); + return ret; + } + imageRef imageCreator::loadImageFromFile2(const char * filePath, abort_callback & aborter, arg_t & arg) { + auto ret = loadImageFromFile(filePath, aborter); + arg.outRealSize = imageSizeSafe(ret); + return ret; + } + imageRef imageCreator::loadImageFromFile3( fsItemFile::ptr fsFile, abort_callback & aborter, arg_t & arg ) { + return loadImageFromFile2( fsFile->canonicalPath()->c_str(), aborter, arg); + } + + + void imageLocation_t::setPath( const char * path_ ) { + this->path = makeString(path_); + } + void imageLocation_t::setPath(stringRef path_) { + this->path = path_; + } + bool imageLocation_t::setTrack2( trackRef track ) { + return setTrack2( track, album_art_ids::cover_front ); + } + bool imageLocation_t::setTrack2( trackRef track, const GUID & albumArtID ) { + if (track.is_empty()) return false; + setPath( pfc::format("trackimage://", pfc::print_guid(albumArtID), ",", track->get_path())); + return true; + } + void imageLocation_t::setStock( const char * name ) { + setPath( pfc::format( "stockimage://", name ) ); + } + stringRef imageLocation_t::getStock( ) const { + if (path.is_valid()) { + if (matchProtocol( path->c_str(), "stockimage" ) ) { + return makeString( strstr( path->c_str(), "://" ) + 3 ); + } + } + return nullptr; + } + + void imageLocation_t::setEmbedded( const char * path_, const GUID & albumArtID ) { + setPath( PFC_string_formatter() << "embedded://" << pfc::print_guid(albumArtID) << "," << path_); + } + bool imageLocation_t::equals(const fb2k::imageLocation_t &l1, const fb2k::imageLocation_t &l2) { + if ( l1.path.is_empty() && l2.path.is_empty() ) return true; + if ( l1.path.is_empty() || l2.path.is_empty() ) return false; + return l1.path->equals( l2.path ); + } + bool imageLocation_t::operator==( imageLocation_t const & other) const { + return equals(*this, other); + } + bool imageLocation_t::operator!=( imageLocation_t const & other) const { + return !equals(*this, other); + } + + imageRef imageLoader::loadStock( const char * name, arg_t const & arg, abort_callback & aborter ) { + imageLocation_t loc; loc.setStock( name ); + return loadSynchronously(loc, arg, aborter); + } + +} + +pfc::string_base & operator<<(pfc::string_base & p_fmt,const fb2k::imageSize_t & imgSize) { + auto iw = pfc::rint32(imgSize.width); + auto ih = pfc::rint32(imgSize.height); + if (iw == imgSize.width && ih == imgSize.height) { + return p_fmt << "(" << iw << "x" << ih << ")"; + } else { + return p_fmt << "(" << imgSize.width << "x" << imgSize.height << ")"; + } +} +
