#include <ctgaloader.h>
Public Methods | |
| ImageData_t * | LoadTgaImage (char *filename) |
| bool | SaveTgaImage (string path, ImageData_t *psImage) |
Private Methods | |
| int | m_GetHeader (char *filename) |
| int | m_GetFooter (char *filename) |
| int | m_ExtractImageData (char *filename, ImageData_t *psImage) |
Private Attributes | |
| struct { | |
| BYTE cIDLength | |
| BYTE cColorMapType | |
| BYTE cImageType | |
| WORD ucFirstEntryIndex | |
| WORD ucColorMapLength | |
| BYTE cColorMapEntrySize | |
| WORD ucXOrigin | |
| WORD ucYOrigin | |
| WORD ucImageWidth | |
| WORD ucImageHeight | |
| BYTE cPixelDepth | |
| BYTE cImageDescriptor | |
| } | m_sTgaHeader |
| struct { | |
| char cFooter [26] | |
| char cSignature [17] | |
| DWORD udExtensionAreaOffset | |
| DWORD udDeveloperDirectoryOffset | |
| BYTE cAsciiChar | |
| BYTE cStringTerminator | |
| } | m_sTgaFooter |
|
|
Definition at line 145 of file ctgaloader.cpp. References m_ExtractImageData(), m_GetFooter(), and m_GetHeader().
00145 {
00146
00147 ImageData_t *psImage = new ImageData_t;
00148
00149
00150 if (m_GetHeader(filename))
00151 return NULL;
00152
00153 if (m_GetFooter(filename))
00154 return NULL;
00155
00156 if (m_ExtractImageData(filename, psImage))
00157 return NULL;
00158
00159
00160 return psImage;
00161 }
|
|
||||||||||||
|
Definition at line 55 of file ctgaloader.cpp. References _ImageData::cColorInfo, _ImageData::dBpp, _ImageData::dHeight, _ImageData::dSize, _ImageData::dWidth, m_sTgaHeader, and _ImageData::pcImageData. Referenced by LoadTgaImage().
00055 {
00056 int dBytesPerPixel;
00057
00058 FILE *file = fopen(filename, "rb");
00059 if (!file)
00060 return 1;
00061
00062 fseek(file, HEADER_SIZE, SEEK_SET);
00063
00064 psImage->dWidth = m_sTgaHeader.ucImageWidth;
00065 psImage->dHeight = m_sTgaHeader.ucImageHeight;
00066 psImage->dBpp = m_sTgaHeader.cPixelDepth;
00067 psImage->cColorInfo = (m_sTgaHeader.cImageType & 0x01);
00068 dBytesPerPixel = psImage->dBpp / 8;
00069 psImage->dSize = psImage->dHeight * psImage->dWidth * dBytesPerPixel;
00070
00071 psImage->pcImageData = (unsigned char *)malloc(psImage->dSize);
00072 if (!psImage->pcImageData) {
00073 fclose(file);
00074 return 1;
00075 }
00076
00077
00078 /*
00079 2 -> uncompressed true color image
00080 3 -> uncompressed black and white image
00081 */
00082 if ((m_sTgaHeader.cImageType == 2) || (m_sTgaHeader.cImageType == 3)) {
00083 //if uncompressed, load the whole data in one step
00084 if (fread(psImage->pcImageData, 1, psImage->dSize, file) != psImage->dSize) {
00085 if (psImage->pcImageData != NULL)
00086 free(psImage->pcImageData);
00087 fclose(file);
00088 return 1;
00089 }
00090 }
00091 /*
00092 10 -> compressed true color image
00093 11 -> compressed black and white image
00094 */
00095 else if ((m_sTgaHeader.cImageType == 10) || (m_sTgaHeader.cImageType == 11)) {
00096 unsigned char ucTempByte[4];
00097 unsigned char ucPackedHead;
00098 unsigned char *pAt;
00099
00100 pAt = psImage->pcImageData;
00101 for (unsigned int i = 0; i < psImage->dSize; ) {
00102 ucPackedHead = (unsigned char) fgetc(file);
00103 //run length encoded
00104 if (ucPackedHead & 0x80) {
00105 ucPackedHead &= 0x7f;
00106 ucPackedHead++;
00107 //load the data
00108 fread(ucTempByte, dBytesPerPixel, 1, file);
00109 //and copy it as told in the packed head
00110 for (unsigned int j = 0; j < ucPackedHead; j++) {
00111 memcpy(pAt, ucTempByte, dBytesPerPixel);
00112 i += dBytesPerPixel;
00113 pAt += dBytesPerPixel;
00114 }
00115 }
00116 //raw mode
00117 else if (!(ucPackedHead & 0x80)) {
00118 ucPackedHead &= 0x7f;
00119 ucPackedHead++;
00120 //load the data, told in the packed head
00121 fread(pAt, dBytesPerPixel, ucPackedHead, file);
00122 i += dBytesPerPixel * ucPackedHead;
00123 pAt += dBytesPerPixel * ucPackedHead;
00124 }
00125 }
00126 }
00127
00128
00129 //if true color image change red and blue, cause tga is stored in BGR!!!
00130 if (!psImage->cColorInfo) {
00131 unsigned char ucTemp;
00132 for (unsigned int i = 0; i < psImage->dSize; i += dBytesPerPixel) {
00133 ucTemp = psImage->pcImageData[i];
00134 psImage->pcImageData[i] = psImage->pcImageData[i+2];
00135 psImage->pcImageData[i+2] = ucTemp;
00136 }
00137 }
00138
00139 fclose(file);
00140
00141 return 0;
00142 }
|
|
|
Definition at line 31 of file ctgaloader.cpp. References m_sTgaFooter. Referenced by LoadTgaImage().
00031 {
00032 FILE *file = fopen(filename, "rb");
00033
00034 if (!file)
00035 return 1;
00036
00037 fseek(file, -26L, SEEK_END);
00038 if (fread(&m_sTgaFooter, 1, sizeof(m_sTgaFooter.cFooter), file) != sizeof(m_sTgaFooter.cFooter)) {
00039 fclose(file);
00040 return 1;
00041 }
00042
00043 //handle footer
00044 memcpy(&m_sTgaFooter.udExtensionAreaOffset, m_sTgaFooter.cFooter, 4);
00045 memcpy(&m_sTgaFooter.udDeveloperDirectoryOffset, m_sTgaFooter.cFooter + 4, 4);
00046 memcpy(&m_sTgaFooter.cSignature, m_sTgaFooter.cFooter + 8, 16);
00047 memcpy(&m_sTgaFooter.cAsciiChar, m_sTgaFooter.cFooter + 24, 1);
00048 memcpy(&m_sTgaFooter.cStringTerminator, m_sTgaFooter.cFooter + 25, 1);
00049 m_sTgaFooter.cSignature[16] = '\0';
00050
00051 return 0;
00052 }
|
|
|
ctgaloader.cpp class CTGALoader klasse die zum laden eines komprimierten und unkomprimierten tga-bildes verwendet wird. weiters wird sie zum speichern der unkomprimierten tga-screenshots verwendet Definition at line 10 of file ctgaloader.cpp. Referenced by LoadTgaImage().
00010 {
00011 FILE *file = fopen(filename, "rb");
00012
00013 if (!file)
00014 return 1;
00015
00016
00017 if (fread(&m_sTgaHeader, 1, sizeof(m_sTgaHeader), file) != sizeof(m_sTgaHeader)) {
00018 fclose(file);
00019 return 1;
00020 }
00021
00022
00023 if (!m_sTgaHeader.cImageType)
00024 return 1;
00025
00026
00027 return 0;
00028 }
|
|
||||||||||||
|
Definition at line 164 of file ctgaloader.cpp. References _ImageData::cColorInfo, _ImageData::dBpp, _ImageData::dHeight, _ImageData::dSize, _ImageData::dWidth, m_sTgaHeader, and _ImageData::pcImageData. Referenced by CMy3dvisView::OnFileSaveImage().
00164 {
00165
00166 FILE *file;
00167 char *buf = NULL;
00168 int buflen = 0;
00169
00170 buflen = GetCurrentDirectory(0, buf);
00171 buf = new char[buflen];
00172 GetCurrentDirectory(buflen, buf);
00173
00174
00175 SetCurrentDirectory((path.substr(0, path.size() - 1)).c_str());
00176 int x = CreateDirectory("screenshots", NULL);
00177 if (x == 0) {
00178 if (GetLastError() != ERROR_ALREADY_EXISTS)
00179 return false;
00180 }
00181
00182
00183 std::string name = path;
00184 name.append("screenshots\\");
00185 name.append("shot__.tga");
00186
00187
00188 for (int i = 0; i < 100; i++) {
00189 name[name.length() - 6] = (i / 10) + '0';
00190 name[name.length() - 5] = (i % 10) + '0';
00191 if ((file = fopen(name.c_str(), "rb")) == NULL)
00192 break;
00193 }
00194
00195 if (i == 100)
00196 return false;
00197
00198
00199 m_sTgaHeader.cIDLength = 0;
00200 m_sTgaHeader.cColorMapType = 0;
00201 m_sTgaHeader.cImageType = 2;
00202 //color map spec
00203 m_sTgaHeader.ucFirstEntryIndex = 0;
00204 m_sTgaHeader.ucColorMapLength = 0;
00205 m_sTgaHeader.cColorMapEntrySize = 0;
00206 //image spec
00207 m_sTgaHeader.ucXOrigin = 0;
00208 m_sTgaHeader.ucYOrigin = 0;
00209 m_sTgaHeader.ucImageWidth = psImage->dWidth;
00210 m_sTgaHeader.ucImageHeight = psImage->dHeight;
00211 m_sTgaHeader.cPixelDepth = psImage->dBpp * 8;
00212 m_sTgaHeader.cImageDescriptor = 0x0000;
00213
00214 if ((file = fopen(name.c_str(), "wb")) == NULL)
00215 return false;
00216
00217
00218 unsigned char *image = new unsigned char[psImage->dSize];
00219 memcpy(image, psImage->pcImageData, psImage->dWidth * psImage->dHeight * 3);
00220 //if true color image change red and blue, cause tga is stored in BGR!!!
00221 if (!psImage->cColorInfo) {
00222 unsigned char ucTemp;
00223 for (unsigned int i = 0; i < psImage->dSize; i += psImage->dBpp) {
00224 ucTemp = image[i];
00225 image[i] = image[i+2];
00226 image[i+2] = ucTemp;
00227 }
00228 }
00229
00230
00231 fwrite(&m_sTgaHeader, sizeof(m_sTgaHeader), 1, file);
00232 fwrite(image, psImage->dSize, 1, file);
00233 fclose(file);
00234
00235 if (image) {
00236 delete[] image;
00237 image = NULL;
00238 }
00239
00240 if (buf) {
00241 SetCurrentDirectory(buf);
00242 delete[] buf;
00243 buf = NULL;
00244 }
00245
00246
00247 return true;
00248 } |
|
|
Definition at line 41 of file ctgaloader.h. |
|
|
Definition at line 25 of file ctgaloader.h. |
|
|
Definition at line 20 of file ctgaloader.h. |
|
|
Definition at line 37 of file ctgaloader.h. |
|
|
Definition at line 19 of file ctgaloader.h. |
|
|
Definition at line 32 of file ctgaloader.h. |
|
|
Definition at line 21 of file ctgaloader.h. |
|
|
Definition at line 31 of file ctgaloader.h. |
|
|
Definition at line 38 of file ctgaloader.h. |
|
|
Definition at line 42 of file ctgaloader.h. |
|
|
Referenced by m_GetFooter(). |
|
|
Referenced by m_ExtractImageData(), and SaveTgaImage(). |
|
|
Definition at line 24 of file ctgaloader.h. |
|
|
Definition at line 23 of file ctgaloader.h. |
|
|
Definition at line 30 of file ctgaloader.h. |
|
|
Definition at line 29 of file ctgaloader.h. |
|
|
Definition at line 27 of file ctgaloader.h. |
|
|
Definition at line 28 of file ctgaloader.h. |
|
|
Definition at line 40 of file ctgaloader.h. |
|
|
Definition at line 39 of file ctgaloader.h. |
1.3-rc2