MCPcopy Create free account
hub / github.com/TorqueGameEngines/Torque3D / ddsCompress

Function ddsCompress

Engine/source/gfx/bitmap/imageUtils.cpp:105–205  ·  view source on GitHub ↗

compress DDSFile

Source from the content-addressed store, hash-verified

103
104 // compress DDSFile
105 bool ddsCompress(DDSFile *srcDDS, const GFXFormat compressFormat,const CompressQuality compressQuality)
106 {
107 if (srcDDS->mBytesPerPixel != 4)
108 {
109 Con::errorf("ImageCompress::ddsCompress: data must be 32bit");
110 return false;
111 }
112
113 //can't compress DDSFile if it is already compressed
114 if (ImageUtil::isCompressedFormat(srcDDS->mFormat))
115 {
116 Con::errorf("ImageCompress::ddsCompress: file is already compressed");
117 return false;
118 }
119
120 const bool cubemap = srcDDS->mFlags.test(DDSFile::CubeMapFlag);
121 const U32 mipCount = srcDDS->mMipMapCount;
122 // We got this far, so assume we can finish (gosh I hope so)
123 srcDDS->mFormat = compressFormat;
124 srcDDS->mFlags.set(DDSFile::CompressedData);
125
126 //grab global thread pool
127 ThreadPool* pThreadPool = &ThreadPool::GLOBAL();
128
129 if (cubemap)
130 {
131 static U32 nCubeFaces = 6;
132 Vector<U8*> dstDataStore;
133 dstDataStore.setSize(nCubeFaces * mipCount);
134
135 for (S32 cubeFace = 0; cubeFace < nCubeFaces; cubeFace++)
136 {
137 DDSFile::SurfaceData *srcSurface = srcDDS->mSurfaces[cubeFace];
138 for (U32 currentMip = 0; currentMip < mipCount; currentMip++)
139 {
140 const U32 dataIndex = cubeFace * mipCount + currentMip;
141 const U8 *srcBits = srcSurface->mMips[currentMip];
142 const U32 mipSz = srcDDS->getSurfaceSize(currentMip);
143 U8 *dstBits = new U8[mipSz];
144 dstDataStore[dataIndex] = dstBits;
145
146 ThreadSafeRef<CompressJob> item(new CompressJob(srcBits, dstBits, srcDDS->getWidth(currentMip), srcDDS->getHeight(currentMip), compressFormat, compressQuality));
147 pThreadPool->queueWorkItem(item);
148
149 }
150 }
151
152 //wait for work items to finish
153 pThreadPool->waitForAllItems();
154
155 for (S32 cubeFace = 0; cubeFace < nCubeFaces; cubeFace++)
156 {
157 DDSFile::SurfaceData *pSrcSurface = srcDDS->mSurfaces[cubeFace];
158 for (U32 currentMip = 0; currentMip < mipCount; currentMip++)
159 {
160 const U32 dataIndex = cubeFace * mipCount + currentMip;
161 delete[] pSrcSurface->mMips[currentMip];
162 pSrcSurface->mMips[currentMip] = dstDataStore[dataIndex];

Callers 5

_updateMethod · 0.85
_updateBaseTextureMethod · 0.85
_createTextureMethod · 0.85
saveFunction · 0.85

Calls 14

isCompressedFormatFunction · 0.85
rawCompressFunction · 0.85
queueWorkItemMethod · 0.80
waitForAllItemsMethod · 0.80
errorfFunction · 0.50
testMethod · 0.45
setMethod · 0.45
setSizeMethod · 0.45
getSurfaceSizeMethod · 0.45
getWidthMethod · 0.45
getHeightMethod · 0.45
lastMethod · 0.45

Tested by

no test coverage detected