Index: core/src/fxcodec/codec/fx_codec.cpp |
diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp |
index 622dab09d9f1f8549f5094f4b1e1ef9058aa2018..a443b7507949686d2875682b2c16d4efcfbacd24 100644 |
--- a/core/src/fxcodec/codec/fx_codec.cpp |
+++ b/core/src/fxcodec/codec/fx_codec.cpp |
@@ -257,347 +257,23 @@ FX_BOOL CCodec_BasicModule::A85Encode(const uint8_t* src_buf, |
FX_DWORD& dest_size) { |
return FALSE; |
} |
-CFX_DIBAttribute::CFX_DIBAttribute() { |
- FXSYS_memset(this, 0, sizeof(CFX_DIBAttribute)); |
- m_nXDPI = -1; |
- m_nYDPI = -1; |
- m_fAspectRatio = -1.0f; |
- m_pExif = new CFX_DIBAttributeExif; |
+CFX_DIBAttribute::CFX_DIBAttribute() |
+ : m_nXDPI(-1), |
+ m_nYDPI(-1), |
+ m_fAspectRatio(-1.0f), |
+ m_wDPIUnit(0), |
+ m_nGifLeft(0), |
+ m_nGifTop(0), |
+ m_pGifLocalPalette(nullptr), |
+ m_nGifLocalPalNum(0), |
+ m_nBmpCompressType(0) { |
+ FXSYS_memset(m_strTime, 0, sizeof(m_strTime)); |
} |
CFX_DIBAttribute::~CFX_DIBAttribute() { |
- if (m_pExif) { |
- delete m_pExif; |
- } |
-} |
-CFX_DIBAttributeExif::CFX_DIBAttributeExif() { |
- m_pExifData = NULL; |
- m_dwExifDataLen = 0; |
-} |
-CFX_DIBAttributeExif::~CFX_DIBAttributeExif() { |
- clear(); |
-} |
-void CFX_DIBAttributeExif::clear() { |
- if (m_pExifData) { |
- FX_Free(m_pExifData); |
- } |
- m_pExifData = NULL; |
- FX_DWORD key = 0; |
- uint8_t* buf = NULL; |
- FX_POSITION pos = NULL; |
- pos = m_TagHead.GetStartPosition(); |
- while (pos) { |
- m_TagHead.GetNextAssoc(pos, key, buf); |
- if (buf) { |
- FX_Free(buf); |
- } |
- } |
- m_TagHead.RemoveAll(); |
- pos = m_TagVal.GetStartPosition(); |
- while (pos) { |
- m_TagVal.GetNextAssoc(pos, key, buf); |
- if (buf) { |
- FX_Free(buf); |
- } |
- } |
- m_TagVal.RemoveAll(); |
-} |
-static FX_WORD _Read2BytesL(uint8_t* data) { |
- ASSERT(data); |
- return data[0] | (data[1] << 8); |
-} |
-static FX_WORD _Read2BytesB(uint8_t* data) { |
- ASSERT(data); |
- return data[1] | (data[0] << 8); |
-} |
-static FX_DWORD _Read4BytesL(uint8_t* data) { |
- return _Read2BytesL(data) | (_Read2BytesL(data + 2) << 16); |
-} |
-static FX_DWORD _Read4BytesB(uint8_t* data) { |
- return _Read2BytesB(data + 2) | (_Read2BytesB(data) << 16); |
-} |
-typedef FX_WORD (*_Read2Bytes)(uint8_t* data); |
-typedef FX_DWORD (*_Read4Bytes)(uint8_t* data); |
-typedef void (*_Write2Bytes)(uint8_t* data, FX_WORD val); |
-typedef void (*_Write4Bytes)(uint8_t* data, FX_DWORD val); |
-uint8_t* CFX_DIBAttributeExif::ParseExifIFH(uint8_t* data, |
- FX_DWORD len, |
- _Read2Bytes* pReadWord, |
- _Read4Bytes* pReadDword) { |
- if (len > 8) { |
- FX_BOOL tag = FALSE; |
- if (FXSYS_memcmp(data, "\x49\x49\x2a\x00", 4) == 0) { |
- if (pReadWord) { |
- *pReadWord = _Read2BytesL; |
- } |
- if (pReadDword) { |
- *pReadDword = _Read4BytesL; |
- } |
- tag = TRUE; |
- } else if (FXSYS_memcmp(data, "\x4d\x4d\x00\x2a", 4) == 0) { |
- if (pReadWord) { |
- *pReadWord = _Read2BytesB; |
- } |
- if (pReadDword) { |
- *pReadDword = _Read4BytesB; |
- } |
- tag = TRUE; |
- } |
- if (tag) { |
- data += 4; |
- if (pReadDword) { |
- data += (*pReadDword)(data)-4; |
- } else { |
- data += 4; |
- } |
- } |
- } |
- return data; |
-} |
-FX_BOOL CFX_DIBAttributeExif::ParseExifIFD( |
- CFX_MapPtrTemplate<FX_DWORD, uint8_t*>* pMap, |
- uint8_t* data, |
- FX_DWORD len) { |
- if (pMap && data) { |
- if (len > 8) { |
- FX_WORD wTagNum = m_readWord(data); |
- data += 2; |
- FX_DWORD wTag; |
- uint8_t* buf; |
- while (wTagNum--) { |
- wTag = m_readWord(data); |
- data += 2; |
- if (!pMap->Lookup(wTag, buf)) { |
- buf = FX_Alloc(uint8_t, 10); |
- if (buf == NULL) { |
- return FALSE; |
- } |
- FXSYS_memcpy(buf, data, 10); |
- pMap->SetAt(wTag, buf); |
- } |
- data += 10; |
- } |
- FX_DWORD dwIFDOffset; |
- dwIFDOffset = m_readDword(data); |
- while (dwIFDOffset && dwIFDOffset < len) { |
- data = m_pExifData + dwIFDOffset; |
- wTagNum = m_readWord(data); |
- data += 2; |
- while (wTagNum--) { |
- wTag = m_readWord(data); |
- data += 2; |
- if (!pMap->Lookup(wTag, buf)) { |
- buf = FX_Alloc(uint8_t, 10); |
- if (buf == NULL) { |
- return FALSE; |
- } |
- FXSYS_memcpy(buf, data, 10); |
- pMap->SetAt(wTag, buf); |
- } |
- data += 10; |
- } |
- dwIFDOffset = m_readDword(data); |
- } |
- return TRUE; |
- } |
- } |
- return FALSE; |
-} |
-enum FX_ExifDataType { |
- FX_UnsignedByte = 1, |
- FX_AscString, |
- FX_UnsignedShort, |
- FX_UnsignedLong, |
- FX_UnsignedRation, |
- FX_SignedByte, |
- FX_Undefined, |
- FX_SignedShort, |
- FX_SignedLong, |
- FX_SignedRation, |
- FX_SignedFloat, |
- FX_DoubleFloat |
-}; |
-FX_BOOL CFX_DIBAttributeExif::ParseExif( |
- CFX_MapPtrTemplate<FX_DWORD, uint8_t*>* pHead, |
- uint8_t* data, |
- FX_DWORD len, |
- CFX_MapPtrTemplate<FX_DWORD, uint8_t*>* pVal) { |
- if (pHead && data && pVal) { |
- if (len > 8) { |
- uint8_t* old_data = data; |
- data = ParseExifIFH(data, len, &m_readWord, &m_readDword); |
- if (data == old_data) { |
- return FALSE; |
- } |
- if (pHead->GetCount() == 0) { |
- if (!ParseExifIFD(pHead, data, len)) { |
- return FALSE; |
- } |
- } |
- FX_DWORD dwModuleNum; |
- FX_WORD type; |
- FX_DWORD dwSize; |
- FX_DWORD tag; |
- uint8_t* head; |
- FX_POSITION pos = pHead->GetStartPosition(); |
- while (pos) { |
- pHead->GetNextAssoc(pos, tag, head); |
- uint8_t* val = NULL; |
- uint8_t* buf = NULL; |
- uint8_t* temp = NULL; |
- int i; |
- if (head) { |
- type = m_readWord(head); |
- head += 2; |
- dwModuleNum = m_readDword(head); |
- head += 4; |
- switch (type) { |
- case FX_UnsignedByte: |
- case FX_AscString: |
- case FX_SignedByte: |
- case FX_Undefined: |
- dwSize = dwModuleNum; |
- val = FX_Alloc(uint8_t, dwSize); |
- if (val == NULL) { |
- return FALSE; |
- } |
- if (dwSize > 4) { |
- FXSYS_memcpy(val, old_data + m_readDword(head), dwSize); |
- } else { |
- FXSYS_memcpy(val, head, dwSize); |
- } |
- break; |
- case FX_UnsignedShort: |
- case FX_SignedShort: |
- dwSize = dwModuleNum << 1; |
- val = FX_Alloc(uint8_t, dwSize); |
- if (val == NULL) { |
- return FALSE; |
- } |
- if (dwSize > 4) { |
- FXSYS_memcpy(val, old_data + m_readDword(head), dwSize); |
- } else { |
- FXSYS_memcpy(val, head, dwSize); |
- } |
- buf = val; |
- for (i = 0; i < (int)dwModuleNum; i++) { |
- *(FX_WORD*)buf = m_readWord(buf); |
- buf += 2; |
- } |
- break; |
- case FX_UnsignedLong: |
- case FX_SignedLong: |
- case FX_SignedFloat: |
- dwSize = dwModuleNum << 2; |
- val = FX_Alloc(uint8_t, dwSize); |
- if (val == NULL) { |
- return FALSE; |
- } |
- if (dwSize > 4) { |
- FXSYS_memcpy(val, old_data + m_readDword(head), dwSize); |
- } else { |
- FXSYS_memcpy(val, head, dwSize); |
- } |
- buf = val; |
- for (i = 0; i < (int)dwModuleNum; i++) { |
- *(FX_DWORD*)buf = m_readDword(buf); |
- buf += 4; |
- } |
- break; |
- case FX_UnsignedRation: |
- case FX_SignedRation: { |
- dwSize = dwModuleNum << 3; |
- buf = FX_Alloc(uint8_t, dwSize); |
- if (buf == NULL) { |
- return FALSE; |
- } |
- if (dwSize > 4) { |
- FXSYS_memcpy(buf, old_data + m_readDword(head), dwSize); |
- } else { |
- FXSYS_memcpy(buf, head, dwSize); |
- } |
- temp = buf; |
- val = FX_Alloc(uint8_t, dwSize / 2); |
- if (val == NULL) { |
- FX_Free(buf); |
- return FALSE; |
- } |
- for (i = 0; i < (int)dwModuleNum; i++) { |
- *(FX_DWORD*)temp = m_readDword(temp); |
- *(FX_DWORD*)(temp + 4) = m_readDword(temp + 4); |
- FX_DWORD* lNumerator = (FX_DWORD*)temp; |
- FX_DWORD* lNenominator = (FX_DWORD*)(temp + 4); |
- *(FX_FLOAT*)(val + i * 4) = |
- (FX_FLOAT)(*lNumerator) / (FX_FLOAT)(*lNenominator); |
- temp += 8; |
- } |
- FX_Free(buf); |
- } break; |
- case FX_DoubleFloat: |
- dwSize = dwModuleNum << 3; |
- val = FX_Alloc(uint8_t, dwSize); |
- if (val == NULL) { |
- return FALSE; |
- } |
- if (dwSize > 4) { |
- FXSYS_memcpy(val, old_data + m_readDword(head), dwSize); |
- } else { |
- FXSYS_memcpy(val, head, dwSize); |
- } |
- buf = val; |
- for (i = 0; i < (int)dwModuleNum; i++) { |
- *(FX_DWORD*)buf = m_readDword(buf); |
- *(FX_DWORD*)(buf + 4) = m_readDword(buf + 4); |
- buf += 8; |
- } |
- break; |
- default: |
- return FALSE; |
- } |
- } |
- pVal->SetAt(tag, val); |
- } |
- return TRUE; |
- } |
- } |
- return FALSE; |
-} |
-#define FXEXIF_INFOCONVERT(T) \ |
- { \ |
- T* src = (T*)ptr; \ |
- T* dst = (T*)val; \ |
- *dst = *src; \ |
- } |
-FX_BOOL CFX_DIBAttributeExif::GetInfo(FX_WORD tag, void* val) { |
- if (m_TagVal.GetCount() == 0) { |
- if (!ParseExif(&m_TagHead, m_pExifData, m_dwExifDataLen, &m_TagVal)) { |
- return FALSE; |
- } |
- } |
- uint8_t* ptr = NULL; |
- if (m_TagVal.Lookup(tag, ptr)) { |
- switch (tag) { |
- case EXIFTAG_USHORT_RESUNIT: |
- FXEXIF_INFOCONVERT(FX_WORD); |
- { |
- FX_WORD* ptr = (FX_WORD*)val; |
- *ptr -= 1; |
- } |
- break; |
- case EXIFTAG_FLOAT_DPIX: |
- case EXIFTAG_FLOAT_DPIY: |
- FXEXIF_INFOCONVERT(FX_FLOAT); |
- break; |
- case EXIFTAG_USHORT_ORIENTATION: |
- FXEXIF_INFOCONVERT(FX_WORD); |
- break; |
- default: { |
- uint8_t** dst = (uint8_t**)val; |
- *dst = ptr; |
- } |
- } |
- } |
- return TRUE; |
+ for (const auto& pair : m_Exif) |
+ FX_Free(pair.second); |
} |
+ |
class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder { |
public: |
CCodec_RLScanlineDecoder(); |