1 /**
2  * Copyright (c) 2006-2019 LOVE Development Team
3  *
4  * This software is provided 'as-is', without any express or implied
5  * warranty.  In no event will the authors be held liable for any damages
6  * arising from the use of this software.
7  *
8  * Permission is granted to anyone to use this software for any purpose,
9  * including commercial applications, and to alter it and redistribute it
10  * freely, subject to the following restrictions:
11  *
12  * 1. The origin of this software must not be misrepresented; you must not
13  *    claim that you wrote the original software. If you use this software
14  *    in a product, an acknowledgment in the product documentation would be
15  *    appreciated but is not required.
16  * 2. Altered source versions must be plainly marked as such, and must not be
17  *    misrepresented as being the original software.
18  * 3. This notice may not be removed or altered from any source distribution.
19  **/
20 
21 #pragma once
22 
23 // LOVE
24 #include "common/Data.h"
25 #include "common/StringMap.h"
26 #include "common/int.h"
27 #include "common/pixelformat.h"
28 #include "CompressedSlice.h"
29 #include "FormatHandler.h"
30 
31 // STL
32 #include <vector>
33 #include <list>
34 
35 namespace love
36 {
37 namespace image
38 {
39 
40 /**
41  * CompressedImageData represents image data which is designed to be uploaded to
42  * the GPU and rendered in its compressed form, without being decompressed.
43  * http://renderingpipeline.com/2012/07/texture-compression/
44  **/
45 class CompressedImageData : public Data
46 {
47 public:
48 
49 	static love::Type type;
50 
51 	CompressedImageData(const std::list<FormatHandler *> &formats, Data *filedata);
52 	CompressedImageData(const CompressedImageData &c);
53 	virtual ~CompressedImageData();
54 
55 	// Implements Data.
56 	CompressedImageData *clone() const override;
57 	void *getData() const override;
58 	size_t getSize() const override;
59 
60 	/**
61 	 * Gets the number of mipmaps in this Compressed Image Data.
62 	 * Includes the base image level.
63 	 **/
64 	int getMipmapCount() const;
65 
66 	/**
67 	 * Gets the number of slices (array layers, cube faces, 3D layers, etc.)
68 	 **/
69 	int getSliceCount(int mip = 0) const;
70 
71 	/**
72 	 * Gets the size in bytes of a sub-image at the specified mipmap level.
73 	 **/
74 	size_t getSize(int miplevel) const;
75 
76 	/**
77 	 * Gets the byte data of a sub-image at the specified mipmap level.
78 	 **/
79 	void *getData(int miplevel) const;
80 
81 	/**
82 	 * Gets the width of a sub-image at the specified mipmap level.
83 	 **/
84 	int getWidth(int miplevel = 0) const;
85 
86 	/**
87 	 * Gets the height of a sub-image at the specified mipmap level.
88 	 **/
89 	int getHeight(int miplevel = 0) const;
90 
91 	/**
92 	 * Gets the format of the compressed data.
93 	 **/
94 	PixelFormat getFormat() const;
95 
96 	bool isSRGB() const;
97 
98 	CompressedSlice *getSlice(int slice, int miplevel) const;
99 
100 protected:
101 
102 	PixelFormat format;
103 	bool sRGB;
104 
105 	// Single block of memory containing all of the sub-images.
106 	StrongRef<CompressedMemory> memory;
107 
108 	// Texture info for each mipmap level.
109 	std::vector<StrongRef<CompressedSlice>> dataImages;
110 
111 	void checkSliceExists(int slice, int miplevel) const;
112 
113 }; // CompressedImageData
114 
115 } // image
116 } // love
117