annotate foosdk/sdk/foobar2000/SDK/image.h @ 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "imageLoaderLite.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "filesystem.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "tracks.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 struct imageSize_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 double width, height;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 static imageSize_t empty() { imageSize_t s = {}; return s; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static bool equals(imageSize_t const & v1, imageSize_t const & v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 bool isValid() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 imageSize_t fitIn( double longerEdge ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 imageSize_t fitIn( imageSize_t size ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 bool operator==(const imageSize_t & other) const { return equals(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 bool operator!=(const imageSize_t & other) const { return !equals(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void sanitize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Helper to allow imageSize_t objects to be used in various sorted contexts.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 static bool greater(imageSize_t const & v1, imageSize_t const & v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 bool operator>(const imageSize_t & other) const { return greater(*this, other); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 bool operator<(const imageSize_t & other) const { return greater(other, *this); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 inline imageSize_t imageSizeMake(double w, double h) { imageSize_t s = { w, h }; return s; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 class image : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 FB2K_MAKE_SERVICE_INTERFACE( image, service_base );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Source URL of this image. May be null if not known or available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 virtual stringRef sourceURL() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! Source data of this image. May be null if not known or available.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 virtual memBlockRef sourceData() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! Resize the image to the specified size.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 virtual imageRef resize(imageSize_t toSize) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! Returns image size.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 virtual imageSize_t size() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 image::ptr resizeToFit( imageSize_t fitInSize );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! Saves as PNG.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 virtual void saveAsPNG( const char * pathSaveAt ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! Saves as JPEG. Quality represented in 0..1 scale
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 virtual void saveAsJPEG( const char * pathSaveAt, float jpegQuality) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Returns if the image has alpha channel or not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 virtual bool hasAlpha() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 virtual bool isFileBacked() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! Returns platform-specific native data. The data remains owned by this image object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 virtual nativeImage_t getNative() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! Detaches platform-specific native data from this image object. The caller becomes the owner of the native data and is responsible for its deletion.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 virtual nativeImage_t detachNative() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 static image::ptr empty() { return NULL; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 struct imageCreatorArg_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 imageSize_t inWantSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 imageSize_t outRealSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 static imageCreatorArg_t empty() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 imageCreatorArg_t arg = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! Provides access to OS specific image object creation facilities. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! By convention, imageCreator methods return nullptr when loading the image fails, rather than throw exceptions.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 class imageCreator : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 FB2K_MAKE_SERVICE_COREAPI( imageCreator );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 typedef imageCreatorArg_t arg_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual imageRef loadImageNamed(const char * imgName, imageSize_t sizeHint = imageSize_t::empty()) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 virtual imageRef loadImageData(const void * data, size_t size, stringRef sourceURL = nullptr) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 virtual imageRef loadImageData(memBlockRef block, stringRef sourceURL = nullptr) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 virtual imageRef loadImageFromFile(const char * filePath, abort_callback & aborter) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 //! Opportunistic image loader helper. Returns immediately without doing any file access and an existing instance of an image object is ready for reuse. Returns null if no such object is available at this time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 virtual imageRef tryReuseImageInstance( const char * filePath ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 virtual imageRef loadImageNamed2( const char * imgName, arg_t & arg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 virtual imageRef loadImageData2( const void * data, size_t size, stringRef sourceURL, arg_t & arg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 virtual imageRef loadImageData2(memBlockRef block, stringRef sourceURL, arg_t & arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 virtual imageRef loadImageFromFile2(const char * filePath, abort_callback & aborter, arg_t & arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 virtual imageRef loadImageFromFile3( fsItemFile::ptr fsFile, abort_callback & aborter, arg_t & arg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 inline imageRef imageWithData( const void * data, size_t size ) {return imageCreator::get()->loadImageData( data, size ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 inline imageRef imageWithData( memBlockRef data ) {return imageCreator::get()->loadImageData(data); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 struct imageLocation_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 bool isValid() const { return path.is_valid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 bool isEmpty() const { return path.is_empty(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 void setPath( const char * path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 void setPath( stringRef path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 bool setTrack2( trackRef track );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 bool setTrack2( trackRef track, const GUID & albumArtID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 void setStock( const char * name );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 void setEmbedded( const char * path, const GUID & albumArtID );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Returns stock image name if this is a stock image reference, nullptr otherwise.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 stringRef getStock( ) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 static bool equals( const imageLocation_t & l1, const imageLocation_t & l2 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 bool operator==( imageLocation_t const & other) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 bool operator!=( imageLocation_t const & other) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 stringRef path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 t_filetimestamp knownTimeStamp = filetimestamp_invalid;// hint
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! Image loader service.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 class imageLoader : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 FB2K_MAKE_SERVICE_COREAPI( imageLoader );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 struct arg_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 arg_t() { wantSize = imageSize_t::empty(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 arg_t( imageSize_t const & size ) : wantSize(size) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 imageSize_t wantSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 imageRef bigImageHint; // optional, provide if you have big non resized version available
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 static arg_t defArg() { arg_t r; return r; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 virtual imageRef tryLoadFromCache( imageLocation_t const & loc, arg_t const & arg ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 virtual imageRef loadSynchronously( imageLocation_t const & loc, arg_t const & arg, abort_callback & aborter ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 virtual objRef beginLoad( imageLocation_t const & loc, arg_t const & arg, objReceiverRef receiver ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 //! Retrieves image cache path for the specified location. The file at the returned path may or may not extist. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 //! Caller must provide valid URL and timestamp in imageLocation_t.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 virtual stringRef cacheLocation( imageLocation_t const & loc, arg_t const & arg) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 //! Similar to beginLoad; completes synchronously if the image is already in cache, passing the image to the receiver.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 objRef beginLoadEx( imageLocation_t const & loc, arg_t const & arg, objReceiverRef receiver );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 //! Helper; loads stock image synchronously.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 imageRef loadStock( const char * name, arg_t const & arg, abort_callback & aborter );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 //! Returns array of possible folder.jpg and alike file names to check for folder-pic. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 //! Provided to avoid hardcoding the list (of folder.jpg, cover.jpg, etc) everywhere. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 //! The returned strings are guaranteed lowercase.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 virtual arrayRef folderPicNames() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 pfc::string_base & operator<<(pfc::string_base & p_fmt,const fb2k::imageSize_t & imgSize);