From d10a0ccadd0ed32cd8bafc626e193bf6d477796b Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 10 Jul 2020 10:21:36 +0300 Subject: [PATCH] . --- .../fontconverter/FontConverter.cpp | 4 +- DesktopEditor/graphics/ImageFilesCache.h | 3 +- .../graphics/MetafileToGraphicsRenderer.cpp | 6 +- .../raster/Metafile/Common/MetaFileUtils.cpp | 1512 +++++++++-------- .../raster/Metafile/Emf/EmfObjects.cpp | 13 +- .../raster/Metafile/Wmf/WmfObjects.cpp | 77 +- .../raster/Metafile/svg/SVGFramework.h | 3 +- HtmlFile/HtmlFile.cpp | 22 +- HtmlRenderer/src/Writer.h | 6 +- 9 files changed, 831 insertions(+), 815 deletions(-) diff --git a/DesktopEditor/fontengine/fontconverter/FontConverter.cpp b/DesktopEditor/fontengine/fontconverter/FontConverter.cpp index 38f8739321..0b140a955e 100644 --- a/DesktopEditor/fontengine/fontconverter/FontConverter.cpp +++ b/DesktopEditor/fontengine/fontconverter/FontConverter.cpp @@ -201,14 +201,14 @@ bool CFontConverter::ToOTF(std::wstring sFontIn, std::wstring sFontOut, unsigned { // error parse font // Просто копируем файл - NSFile::CFileBinary::Copy(sFontIn, sFontOut); + oFileBinary.Copy(sFontIn, sFontOut); } } } else { // Просто копируем файл - NSFile::CFileBinary::Copy(sFontIn, sFontOut); + oFileBinary.Copy(sFontIn, sFontOut); } FT_Done_Face( pFace ); diff --git a/DesktopEditor/graphics/ImageFilesCache.h b/DesktopEditor/graphics/ImageFilesCache.h index 1dec88060c..5a718a75a3 100644 --- a/DesktopEditor/graphics/ImageFilesCache.h +++ b/DesktopEditor/graphics/ImageFilesCache.h @@ -75,7 +75,8 @@ public: oMetafile.ConvertToRaster(sTempFile.c_str(), 4, 1000, -1); m_oImage.Create(sTempFile); - NSFile::CFileBinary::Remove(sTempFile); + NSFile::CFileBinary file; + file.Remove(sTempFile); } } } diff --git a/DesktopEditor/graphics/MetafileToGraphicsRenderer.cpp b/DesktopEditor/graphics/MetafileToGraphicsRenderer.cpp index d0d0434f37..025a48b937 100644 --- a/DesktopEditor/graphics/MetafileToGraphicsRenderer.cpp +++ b/DesktopEditor/graphics/MetafileToGraphicsRenderer.cpp @@ -80,11 +80,13 @@ namespace NSOnlineOfficeBinToPdf ~CMetafileToRenderterRaster_private() { + NSFile::CFileBinary file; for (std::vector::iterator i = m_arTempFiles.begin(); i != m_arTempFiles.end(); i++) { std::wstring sPath = *i; - if (NSFile::CFileBinary::Exists(sPath)) - NSFile::CFileBinary::Remove(sPath); + + if (file.Exists(sPath)) + file.Remove(sPath); } } }; diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileUtils.cpp b/DesktopEditor/raster/Metafile/Common/MetaFileUtils.cpp index 6691fddbf1..d7d0f75c61 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileUtils.cpp +++ b/DesktopEditor/raster/Metafile/Common/MetaFileUtils.cpp @@ -82,761 +82,763 @@ namespace MetaFile return false; } - bool ReadImageInfoHeader(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight) - { - CDataStream oHeaderStream; - oHeaderStream.SetStream(pHeaderBuffer, ulHeaderBufferLen); - - int nWidth; - int nHeight; - - unsigned short ushPlanes; - unsigned short ushBitCount; - - unsigned int unCompression; - unsigned int unImageSize; - unsigned int unXPelsPerMeter; - unsigned int unYPelsPerMeter; - unsigned int unColorUsed; - unsigned int unColorImportant; - - oHeaderStream >> nWidth; - oHeaderStream >> nHeight; - oHeaderStream >> ushPlanes; - oHeaderStream >> ushBitCount; - oHeaderStream >> unCompression; - oHeaderStream >> unImageSize; - oHeaderStream >> unXPelsPerMeter; - oHeaderStream >> unYPelsPerMeter; - oHeaderStream >> unColorUsed; - oHeaderStream >> unColorImportant; - - if (0x0001 != ushPlanes) - return false; - - if (nHeight < 0x00000000 && (BI_RGB != unCompression)) - return false; - - if (nWidth < 0) - return false; - - BYTE* pBgraBuffer = NULL; - unsigned int ulWidth = 0; - unsigned int ulHeight = 0; - - BYTE* pBuffer = pImageBuffer; - int lBufLen = ulImageBufferLen; - - *ppDstBuffer = NULL; - *pulWidth = 0; - *pulHeight = 0; - - if (BI_BITCOUNT_0 == ushBitCount) // Значит компрессия либо PNG, либо JPEG - { - if (BI_JPEG != unCompression || BI_PNG != unCompression) - return false; - - std::wstring wsTempFileName; - FILE* pTempFile = NULL; - if (!OpenTempFile(&wsTempFileName, &pTempFile, L"wb", L".wmf0", NULL)) - return false; - - ::fwrite(pBuffer, 1, unImageSize, pTempFile); - ::fclose(pTempFile); - - CBgraFrame oFrame; - oFrame.OpenFile(wsTempFileName); - - // TODO: Как будут файлы сделать чтение. - NSFile::CFileBinary::Remove(wsTempFileName); - return false; - } - else if (BI_BITCOUNT_1 == ushBitCount) - { - // Двуцветная картинка, значит палитра состоит из 2-х цветов - TRgbQuad oColor1, oColor2; - - if (oHeaderStream.CanRead() >= 8) - oHeaderStream >> oColor1 >> oColor2; - - // Считываем саму картинку - int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); - if (lCalcLen > lBufLen) - return false; - - pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; - if (NULL == pBgraBuffer) - return false; - - ulHeight = (unsigned short)abs(nHeight); - ulWidth = (unsigned short)nWidth; - - int nWidthBytes = (nWidth + 7) / 8; - int nAdditBytes = 4 - div_t(div(((nWidth + 7) / 8), 4)).rem; - if (4 == nAdditBytes) - nAdditBytes = 0; - - int nLastBitCount = div_t(div(nWidth, 8)).rem - 1; - if (-1 == nLastBitCount) - nLastBitCount = 7; - - nLastBitCount = (int)pow((double)2, (double)nLastBitCount); - - if (nHeight < 0) - { - for (int nY = 0; nY < abs(nHeight); nY++) - { - int nIndex = 4 * nWidth * nY; - for (int nX = 0; nX < nWidthBytes; nX++) - { - int nByte = *pBuffer; pBuffer++; lBufLen--; - int nBitCount = 128; - int nAlpha = 255; - if (nX == nWidthBytes - 1) - { - // Не до конца заполненный байт иногда заполняется странным цветом, поэтому мы делаем его прозрачным - nBitCount = nLastBitCount; - nAlpha = 0; - } - - for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2) - { - int nBit = (nByte & nBitIndex); - TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1); - pBgraBuffer[nIndex + 0] = pColor->b; - pBgraBuffer[nIndex + 1] = pColor->g; - pBgraBuffer[nIndex + 2] = pColor->r; - pBgraBuffer[nIndex + 3] = nAlpha; - nIndex += 4; - } - } - for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++) - { - int nByte = *pBuffer; pBuffer++; lBufLen--; - } - } - } - else - { - for (int nY = abs(nHeight) - 1; nY >= 0; nY--) - { - int nIndex = 4 * nWidth * nY; - for (int nX = 0; nX < nWidthBytes; nX++) - { - int nByte = *pBuffer; pBuffer++; lBufLen--; - int nBitCount = 128; - int nAlpha = 255; - if (nX == nWidthBytes - 1) - { - // Не до конца заполненный байт иногда заполняется странным цветом, поэтому мы делаем его прозрачным - nBitCount = nLastBitCount; - //nAlpha = 0; - } - - for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2) - { - int nBit = (nByte & nBitIndex); - TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1); - pBgraBuffer[nIndex + 0] = pColor->b; - pBgraBuffer[nIndex + 1] = pColor->g; - pBgraBuffer[nIndex + 2] = pColor->r; - pBgraBuffer[nIndex + 3] = nAlpha; - nIndex += 4; - } - } - for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++) - { - int nByte = *pBuffer; pBuffer++; lBufLen--; - } - } - } - - *ppDstBuffer = pBgraBuffer; - *pulWidth = ulWidth; - *pulHeight = ulHeight; - - return true; - } - else if (BI_BITCOUNT_2 == ushBitCount) - { - unsigned char unColorTableLen = 16; - if (0 != unColorUsed) - unColorTableLen = (std::min)((unsigned char)16, (unsigned char)unColorUsed); - - TRgbQuad oColorTable[16]; - if (oHeaderStream.CanRead() < unColorTableLen * 4) - return false; - - // Считываем палитру - for (unsigned short ushIndex = 0; ushIndex < unColorTableLen; ushIndex++) - { - oHeaderStream >> oColorTable[ushIndex]; - } - - // 4 бита - 1 пиксел - - // Считываем саму картинку - int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); - if (lCalcLen != lBufLen) - return false; - - // Ширина в байтах должна быть кратна 4, значит сама ширина должна быть кратна 8 - int nAdd = 0; - while (0 != div_t(div(nWidth + nAdd, 8)).rem) - { - nAdd++; - } - - int nScanLineBytes = (nWidth + nAdd) / 2; - if (lBufLen < (nScanLineBytes * abs(nHeight))) - return false; - - pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; - if (NULL == pBgraBuffer) - return false; - - ulHeight = (unsigned short)abs(nHeight); - ulWidth = (unsigned short)nWidth; - - if (nHeight < 0) - { - for (int nY = 0; nY < abs(nHeight); nY++) - { - for (int nLineIndex = 0; nLineIndex < nScanLineBytes; nLineIndex++) - { - BYTE nByte = *pBuffer; pBuffer++; - - int nX = nLineIndex * 2; - int nIndex = 4 * (nWidth * nY + nX); - BYTE nColorIndex = (nByte & 0xf0) >> 4; - - if (nX < nWidth) - { - pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; - pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; - pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; - pBgraBuffer[nIndex + 3] = 255; - } - - nX = nLineIndex * 2 + 1; - nIndex = 4 * (nWidth * nY + nX); - nColorIndex = nByte & 0x0f; - - if (nX < nWidth) - { - pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; - pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; - pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; - pBgraBuffer[nIndex + 3] = 255; - } - } - } - } - else - { - for (int nY = abs(nHeight) - 1; nY >= 0; nY--) - { - for (int nLineIndex = 0; nLineIndex < nScanLineBytes; nLineIndex++) - { - BYTE nByte = *pBuffer; pBuffer++; - - int nX = nLineIndex * 2; - int nIndex = 4 * (nWidth * nY + nX); - BYTE nColorIndex = (nByte & 0xf0) >> 4; - - if (nX < nWidth) - { - pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; - pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; - pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; - pBgraBuffer[nIndex + 3] = 255; - } - - nX = nLineIndex * 2 + 1; - nIndex = 4 * (nWidth * nY + nX); - nColorIndex = nByte & 0x0f; - - if (nX < nWidth) - { - pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; - pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; - pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; - pBgraBuffer[nIndex + 3] = 255; - } - } - } - } - - *ppDstBuffer = pBgraBuffer; - *pulWidth = ulWidth; - *pulHeight = ulHeight; - - return true; - } - else if (BI_BITCOUNT_3 == ushBitCount) - { - unsigned short ushColorTableLen = 256; - - if (0 != unColorUsed) - ushColorTableLen = (std::min)((unsigned short)256, (unsigned short)unColorUsed); - - TRgbQuad oColorTable[256]; - if (oHeaderStream.CanRead() < ushColorTableLen * 4) - return false; - - // Считываем палитру - for (unsigned short ushIndex = 0; ushIndex < ushColorTableLen; ushIndex++) - { - oHeaderStream >> oColorTable[ushIndex]; - } - - // 1 байт - 1 пиксел - // Ширина должна быть кратна 4. - int nAdd = 0; - while (0 != div_t(div(nWidth + nAdd, 4)).rem) - { - nAdd++; - } - - BYTE* pUncompressedBuffer = NULL; - if (BI_RLE8 == unCompression) - { - int nStride = nWidth + nAdd; - int lUncompressedLen = nStride * abs(nHeight); - pUncompressedBuffer = new BYTE[lUncompressedLen]; - if (!pUncompressedBuffer) - return false; - - for (int nPos = 0, nUncompressedPos = 0, nLinePos = 0; nPos < lBufLen; nPos += 2) - { - BYTE nCount = pBuffer[nPos]; - BYTE nColor = pBuffer[nPos + 1]; - - if (nCount == 0) - { - // End of line. - if (0 == nColor) - { - if (nLinePos < nStride) - { - int nAdditionalSpace = nStride - nLinePos; - - if (nUncompressedPos + nAdditionalSpace > lUncompressedLen) - break; - - ::memset(pUncompressedBuffer + nUncompressedPos, 0, nAdditionalSpace); - nUncompressedPos += nAdditionalSpace; - } - - nLinePos = 0; - - continue; - } - // End of bitmap. - else if (1 == nColor) - { - break; - } - else - { - // TODO: 2 - break; - } - } - - nLinePos += nCount; - while (nLinePos >= nStride) - { - nLinePos -= nStride; - } - - if (nUncompressedPos + nCount > lUncompressedLen) - break; - - for (int i = 0; i < nCount; ++i) - pUncompressedBuffer[nUncompressedPos + i] = nColor; - - ::memset(pUncompressedBuffer + nUncompressedPos, nColor, nCount); - nUncompressedPos += nCount; - } - - pBuffer = pUncompressedBuffer; - lBufLen = lUncompressedLen; - } - - if (lBufLen < (nWidth + nAdd) * abs(nHeight)) - return false; - - pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; - if (NULL == pBgraBuffer) - return false; - - ulHeight = (unsigned short)abs(nHeight); - ulWidth = (unsigned short)nWidth; - - if (nHeight < 0) - { - for (int nY = 0; nY < abs(nHeight); nY++) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * (nWidth * nY + nX); - - BYTE nByte = *pBuffer; pBuffer++; lBufLen--; - - pBgraBuffer[nIndex + 0] = oColorTable[nByte].b; - pBgraBuffer[nIndex + 1] = oColorTable[nByte].g; - pBgraBuffer[nIndex + 2] = oColorTable[nByte].r; - pBgraBuffer[nIndex + 3] = 255; - } - pBuffer += nAdd; lBufLen -= nAdd; - } - } - else - { - for (int nY = abs(nHeight) - 1; nY >= 0; nY--) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * (nWidth * nY + nX); - - BYTE nByte = *pBuffer; pBuffer++; lBufLen--; - - pBgraBuffer[nIndex + 0] = oColorTable[nByte].b; - pBgraBuffer[nIndex + 1] = oColorTable[nByte].g; - pBgraBuffer[nIndex + 2] = oColorTable[nByte].r; - pBgraBuffer[nIndex + 3] = 255; - } - pBuffer += nAdd; lBufLen -= nAdd; - } - } - - *ppDstBuffer = pBgraBuffer; - *pulWidth = ulWidth; - *pulHeight = ulHeight; - - if (pUncompressedBuffer) - delete[] pUncompressedBuffer; - - return true; - } - else if (BI_BITCOUNT_4 == ushBitCount) - { - unsigned int ulMaskR = 0x1f, ulMaskB = 0x7C00, ulMaskG = 0x3E0; - unsigned int ulShiftR = 0, ulShiftB = 10, ulShiftG = 5; - double dKoefR = 255 / 31.0, dKoefB = 255 / 31.0, dKoefG = 255 / 31.0; - - if (BI_RGB == unCompression) - { - // Маски, сдвиги и коэффициенты уже заполнены стандартными значениями для масок - // 000000000011111 - Red - // 000001111100000 - Green - // 111110000000000 - Blue - } - else if (BI_BITFIELDS == unCompression) - { - oHeaderStream >> ulMaskB; - oHeaderStream >> ulMaskG; - oHeaderStream >> ulMaskR; - - ulShiftR = GetLowestBit(ulMaskR); - ulShiftB = GetLowestBit(ulMaskB); - ulShiftG = GetLowestBit(ulMaskG); - - dKoefR = 255.0 / (ulMaskR >> ulShiftR); - dKoefG = 255.0 / (ulMaskG >> ulShiftG); - dKoefB = 255.0 / (ulMaskB >> ulShiftB); - } - else - return false; - - // Считываем саму картинку - int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); - if (lCalcLen != lBufLen) - return false; - - // 2 байт на все каналы канал - // (Ширина * 3) должна быть кратна 4. - int nAdd = 0; - while (0 != div_t(div(2 * nWidth + nAdd, 4)).rem) - { - nAdd++; - } - - pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; - if (NULL == pBgraBuffer) - return false; - - ulHeight = (unsigned short)abs(nHeight); - ulWidth = (unsigned short)nWidth; - - if (nHeight < 0) - { - for (int nY = 0; nY < abs(nHeight); nY++) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * (nWidth * nY + nX); - - unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 0xFFFF; pBuffer += 2; lBufLen -= 2; - - unsigned char unR = (ushValue & ulMaskR) >> ulShiftR; - unsigned char unG = (ushValue & ulMaskG) >> ulShiftG; - unsigned char unB = (ushValue & ulMaskB) >> ulShiftB; - - pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); - pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); - pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); - pBgraBuffer[nIndex + 3] = 255; - } - pBuffer += nAdd; lBufLen -= nAdd; - } - } - else - { - for (int nY = abs(nHeight) - 1; nY >= 0; nY--) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * (nWidth * nY + nX); - - unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 0xFFFF; pBuffer += 2; lBufLen -= 2; - unsigned char unR = (ushValue & ulMaskR) >> ulShiftR; - unsigned char unG = (ushValue & ulMaskG) >> ulShiftG; - unsigned char unB = (ushValue & ulMaskB) >> ulShiftB; - - pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); - pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); - pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); - pBgraBuffer[nIndex + 3] = 255; - } - pBuffer += nAdd; lBufLen -= nAdd; - } - } - - *ppDstBuffer = pBgraBuffer; - *pulWidth = ulWidth; - *pulHeight = ulHeight; - - return false; - } - else if (BI_BITCOUNT_5 == ushBitCount) - { - if (BI_RGB != unCompression) - return false; // TODO: Сделать данный вариант, как только будет файлы с данным типом - - // Считываем саму картинку - int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); - if (lCalcLen != lBufLen) - return false; - - // 1 байт на каждый канал - // (Ширина * 3) должна быть кратна 4. - int nAdd = 0; - while (0 != div_t(div(3 * nWidth + nAdd, 4)).rem) - { - nAdd++; - } - - int nSize = nWidth * nHeight * 4; - - pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; - if (NULL == pBgraBuffer) - return false; - - ulHeight = (unsigned short)abs(nHeight); - ulWidth = (unsigned short)nWidth; - - if (nHeight < 0) - { - for (int nY = 0; nY < abs(nHeight); nY++) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * (nWidth * nY + nX); - - pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 3] = 255; - } - pBuffer += nAdd; lBufLen -= nAdd; - } - } - else - { - for (int nY = abs(nHeight) - 1; nY >= 0; nY--) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * (nWidth * nY + nX); - pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 3] = 255; - } - pBuffer += nAdd; lBufLen -= nAdd; - } - } - - *ppDstBuffer = pBgraBuffer; - *pulWidth = ulWidth; - *pulHeight = ulHeight; - - return true; - } - else if (BI_BITCOUNT_6 == ushBitCount) - { - unsigned int ulMaskR = 0xff000000, ulMaskB = 0x00ff0000, ulMaskG = 0x0000ff00; - unsigned int ulShiftR = 24, ulShiftB = 16, ulShiftG = 8; - double dKoefR = 1.0, dKoefB = 1.0, dKoefG = 1.0; - bool bMask = false; - - if (BI_RGB == unCompression) - { - // Маски, сдвиги и коэффициенты уже заполнены стандартными значениями для масок - } - else if (BI_BITFIELDS == unCompression) - { - if (oHeaderStream.CanRead() < 12) - return false; - - oHeaderStream >> ulMaskB; - oHeaderStream >> ulMaskG; - oHeaderStream >> ulMaskR; - - ulShiftR = GetLowestBit(ulMaskR); - ulShiftB = GetLowestBit(ulMaskB); - ulShiftG = GetLowestBit(ulMaskG); - - dKoefR = 255.0 / (ulMaskR >> ulShiftR); - dKoefG = 255.0 / (ulMaskG >> ulShiftG); - dKoefB = 255.0 / (ulMaskB >> ulShiftB); - - if ((ulMaskR >> ulShiftR) == 255 && (ulMaskG >> ulShiftG) == 255 && (ulMaskB >> ulShiftB) == 255) - { - bMask = false; // Proper_Attire_CALT2.odt - } - else - bMask = true; - } - else - return false; - - // Считываем саму картинку - int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); - if (lCalcLen != lBufLen) - return false; - - // 1 байт на каждый канал - // Ширина должна быть кратна 4. - int nAdd = 0; - while (0 != div_t(div(nWidth + nAdd, 4)).rem) - { - nAdd++; - } - - int nSize = nWidth * nHeight * 4; - - pBgraBuffer = new BYTE[(nWidth + nAdd) * abs(nHeight) * 4 * sizeof(BYTE)]; - if (NULL == pBgraBuffer) - return false; - - ulHeight = (unsigned short)abs(nHeight); - ulWidth = (unsigned short)(nWidth + nAdd); - - if (nHeight < 0) - { - for (int nY = 0; nY < abs(nHeight); nY++) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * ((nWidth + nAdd) * nY + nX); - - if (bMask) - { - unsigned int unValue = ((pBuffer[3] << 24) | (pBuffer[2] << 16) | (pBuffer[1] << 8) | pBuffer[0]) & 0xFFFFFFFF; pBuffer += 4; lBufLen -= 4; - - unsigned char unR = (unValue & ulMaskR) >> ulShiftR; - unsigned char unG = (unValue & ulMaskG) >> ulShiftG; - unsigned char unB = (unValue & ulMaskB) >> ulShiftB; - - pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); - pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); - pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); - pBgraBuffer[nIndex + 3] = pBuffer[3]; - } - else - { - pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 3] = 255; pBuffer++; lBufLen--; // Если брать значение из картинки, тогда она получается всегда прозрачной - } - } - for (int nX = nWidth; nX < nWidth + nAdd; nX++) - { - int nIndex = 4 * ((nWidth + nAdd) * nY + nX); - - pBgraBuffer[nIndex + 0] = 255; - pBgraBuffer[nIndex + 1] = 255; - pBgraBuffer[nIndex + 2] = 255; - pBgraBuffer[nIndex + 3] = 0; - } - } - } - else - { - for (int nY = abs(nHeight) - 1; nY >= 0; nY--) - { - for (int nX = 0; nX < nWidth; nX++) - { - int nIndex = 4 * ((nWidth + nAdd) * nY + nX); - if (bMask) - { - unsigned int unValue = ((pBuffer[3] << 24) | (pBuffer[2] << 16) | (pBuffer[1] << 8) | pBuffer[0]) & 0xFFFFFFFF; pBuffer += 4; lBufLen -= 4; - - unsigned char unR = (unValue & ulMaskR) >> ulShiftR; - unsigned char unG = (unValue & ulMaskG) >> ulShiftG; - unsigned char unB = (unValue & ulMaskB) >> ulShiftB; - - pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); - pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); - pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); - pBgraBuffer[nIndex + 3] = pBuffer[3]; - } - else - { - pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; - pBgraBuffer[nIndex + 3] = 255; pBuffer++; lBufLen--; // Если брать значение из картинки, тогда она получается всегда прозрачной - } - } - - for (int nX = nWidth; nX < nWidth + nAdd; nX++) - { - int nIndex = 4 * ((nWidth + nAdd) * nY + nX); - - pBgraBuffer[nIndex + 0] = 255; - pBgraBuffer[nIndex + 1] = 255; - pBgraBuffer[nIndex + 2] = 255; - pBgraBuffer[nIndex + 3] = 0; - } - - } - } - - *ppDstBuffer = pBgraBuffer; - *pulWidth = ulWidth; - *pulHeight = ulHeight; - - return true; - } - - return false; - } - void ReadImage(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight) + bool ReadImageInfoHeader(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight) + { + NSFile::CFileBinary file; + + CDataStream oHeaderStream; + oHeaderStream.SetStream(pHeaderBuffer, ulHeaderBufferLen); + + int nWidth; + int nHeight; + + unsigned short ushPlanes; + unsigned short ushBitCount; + + unsigned int unCompression; + unsigned int unImageSize; + unsigned int unXPelsPerMeter; + unsigned int unYPelsPerMeter; + unsigned int unColorUsed; + unsigned int unColorImportant; + + oHeaderStream >> nWidth; + oHeaderStream >> nHeight; + oHeaderStream >> ushPlanes; + oHeaderStream >> ushBitCount; + oHeaderStream >> unCompression; + oHeaderStream >> unImageSize; + oHeaderStream >> unXPelsPerMeter; + oHeaderStream >> unYPelsPerMeter; + oHeaderStream >> unColorUsed; + oHeaderStream >> unColorImportant; + + if (0x0001 != ushPlanes) + return false; + + if (nHeight < 0x00000000 && (BI_RGB != unCompression)) + return false; + + if (nWidth < 0) + return false; + + BYTE* pBgraBuffer = NULL; + unsigned int ulWidth = 0; + unsigned int ulHeight = 0; + + BYTE* pBuffer = pImageBuffer; + int lBufLen = ulImageBufferLen; + + *ppDstBuffer = NULL; + *pulWidth = 0; + *pulHeight = 0; + + if (BI_BITCOUNT_0 == ushBitCount) // Значит компрессия либо PNG, либо JPEG + { + if (BI_JPEG != unCompression || BI_PNG != unCompression) + return false; + + std::wstring wsTempFileName; + FILE* pTempFile = NULL; + if (!OpenTempFile(&wsTempFileName, &pTempFile, L"wb", L".wmf0", NULL)) + return false; + + ::fwrite(pBuffer, 1, unImageSize, pTempFile); + ::fclose(pTempFile); + + CBgraFrame oFrame; + oFrame.OpenFile(wsTempFileName); + + // TODO: Как будут файлы сделать чтение. + file.Remove(wsTempFileName); + return false; + } + else if (BI_BITCOUNT_1 == ushBitCount) + { + // Двуцветная картинка, значит палитра состоит из 2-х цветов + TRgbQuad oColor1, oColor2; + + if (oHeaderStream.CanRead() >= 8) + oHeaderStream >> oColor1 >> oColor2; + + // Считываем саму картинку + int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); + if (lCalcLen > lBufLen) + return false; + + pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; + if (NULL == pBgraBuffer) + return false; + + ulHeight = (unsigned short)abs(nHeight); + ulWidth = (unsigned short)nWidth; + + int nWidthBytes = (nWidth + 7) / 8; + int nAdditBytes = 4 - div_t(div(((nWidth + 7) / 8), 4)).rem; + if (4 == nAdditBytes) + nAdditBytes = 0; + + int nLastBitCount = div_t(div(nWidth, 8)).rem - 1; + if (-1 == nLastBitCount) + nLastBitCount = 7; + + nLastBitCount = (int)pow((double)2, (double)nLastBitCount); + + if (nHeight < 0) + { + for (int nY = 0; nY < abs(nHeight); nY++) + { + int nIndex = 4 * nWidth * nY; + for (int nX = 0; nX < nWidthBytes; nX++) + { + int nByte = *pBuffer; pBuffer++; lBufLen--; + int nBitCount = 128; + int nAlpha = 255; + if (nX == nWidthBytes - 1) + { + // Не до конца заполненный байт иногда заполняется странным цветом, поэтому мы делаем его прозрачным + nBitCount = nLastBitCount; + nAlpha = 0; + } + + for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2) + { + int nBit = (nByte & nBitIndex); + TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1); + pBgraBuffer[nIndex + 0] = pColor->b; + pBgraBuffer[nIndex + 1] = pColor->g; + pBgraBuffer[nIndex + 2] = pColor->r; + pBgraBuffer[nIndex + 3] = nAlpha; + nIndex += 4; + } + } + for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++) + { + int nByte = *pBuffer; pBuffer++; lBufLen--; + } + } + } + else + { + for (int nY = abs(nHeight) - 1; nY >= 0; nY--) + { + int nIndex = 4 * nWidth * nY; + for (int nX = 0; nX < nWidthBytes; nX++) + { + int nByte = *pBuffer; pBuffer++; lBufLen--; + int nBitCount = 128; + int nAlpha = 255; + if (nX == nWidthBytes - 1) + { + // Не до конца заполненный байт иногда заполняется странным цветом, поэтому мы делаем его прозрачным + nBitCount = nLastBitCount; + //nAlpha = 0; + } + + for (int nBitIndex = nBitCount; nBitIndex > 0; nBitIndex /= 2) + { + int nBit = (nByte & nBitIndex); + TRgbQuad* pColor = (nBit ? &oColor2 : &oColor1); + pBgraBuffer[nIndex + 0] = pColor->b; + pBgraBuffer[nIndex + 1] = pColor->g; + pBgraBuffer[nIndex + 2] = pColor->r; + pBgraBuffer[nIndex + 3] = nAlpha; + nIndex += 4; + } + } + for (int nAddIndex = 0; nAddIndex < nAdditBytes; nAddIndex++) + { + int nByte = *pBuffer; pBuffer++; lBufLen--; + } + } + } + + *ppDstBuffer = pBgraBuffer; + *pulWidth = ulWidth; + *pulHeight = ulHeight; + + return true; + } + else if (BI_BITCOUNT_2 == ushBitCount) + { + unsigned char unColorTableLen = 16; + if (0 != unColorUsed) + unColorTableLen = (std::min)((unsigned char)16, (unsigned char)unColorUsed); + + TRgbQuad oColorTable[16]; + if (oHeaderStream.CanRead() < unColorTableLen * 4) + return false; + + // Считываем палитру + for (unsigned short ushIndex = 0; ushIndex < unColorTableLen; ushIndex++) + { + oHeaderStream >> oColorTable[ushIndex]; + } + + // 4 бита - 1 пиксел + + // Считываем саму картинку + int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); + if (lCalcLen != lBufLen) + return false; + + // Ширина в байтах должна быть кратна 4, значит сама ширина должна быть кратна 8 + int nAdd = 0; + while (0 != div_t(div(nWidth + nAdd, 8)).rem) + { + nAdd++; + } + + int nScanLineBytes = (nWidth + nAdd) / 2; + if (lBufLen < (nScanLineBytes * abs(nHeight))) + return false; + + pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; + if (NULL == pBgraBuffer) + return false; + + ulHeight = (unsigned short)abs(nHeight); + ulWidth = (unsigned short)nWidth; + + if (nHeight < 0) + { + for (int nY = 0; nY < abs(nHeight); nY++) + { + for (int nLineIndex = 0; nLineIndex < nScanLineBytes; nLineIndex++) + { + BYTE nByte = *pBuffer; pBuffer++; + + int nX = nLineIndex * 2; + int nIndex = 4 * (nWidth * nY + nX); + BYTE nColorIndex = (nByte & 0xf0) >> 4; + + if (nX < nWidth) + { + pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; + pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; + pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; + pBgraBuffer[nIndex + 3] = 255; + } + + nX = nLineIndex * 2 + 1; + nIndex = 4 * (nWidth * nY + nX); + nColorIndex = nByte & 0x0f; + + if (nX < nWidth) + { + pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; + pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; + pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; + pBgraBuffer[nIndex + 3] = 255; + } + } + } + } + else + { + for (int nY = abs(nHeight) - 1; nY >= 0; nY--) + { + for (int nLineIndex = 0; nLineIndex < nScanLineBytes; nLineIndex++) + { + BYTE nByte = *pBuffer; pBuffer++; + + int nX = nLineIndex * 2; + int nIndex = 4 * (nWidth * nY + nX); + BYTE nColorIndex = (nByte & 0xf0) >> 4; + + if (nX < nWidth) + { + pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; + pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; + pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; + pBgraBuffer[nIndex + 3] = 255; + } + + nX = nLineIndex * 2 + 1; + nIndex = 4 * (nWidth * nY + nX); + nColorIndex = nByte & 0x0f; + + if (nX < nWidth) + { + pBgraBuffer[nIndex + 0] = oColorTable[nColorIndex].b; + pBgraBuffer[nIndex + 1] = oColorTable[nColorIndex].g; + pBgraBuffer[nIndex + 2] = oColorTable[nColorIndex].r; + pBgraBuffer[nIndex + 3] = 255; + } + } + } + } + + *ppDstBuffer = pBgraBuffer; + *pulWidth = ulWidth; + *pulHeight = ulHeight; + + return true; + } + else if (BI_BITCOUNT_3 == ushBitCount) + { + unsigned short ushColorTableLen = 256; + + if (0 != unColorUsed) + ushColorTableLen = (std::min)((unsigned short)256, (unsigned short)unColorUsed); + + TRgbQuad oColorTable[256]; + if (oHeaderStream.CanRead() < ushColorTableLen * 4) + return false; + + // Считываем палитру + for (unsigned short ushIndex = 0; ushIndex < ushColorTableLen; ushIndex++) + { + oHeaderStream >> oColorTable[ushIndex]; + } + + // 1 байт - 1 пиксел + // Ширина должна быть кратна 4. + int nAdd = 0; + while (0 != div_t(div(nWidth + nAdd, 4)).rem) + { + nAdd++; + } + + BYTE* pUncompressedBuffer = NULL; + if (BI_RLE8 == unCompression) + { + int nStride = nWidth + nAdd; + int lUncompressedLen = nStride * abs(nHeight); + pUncompressedBuffer = new BYTE[lUncompressedLen]; + if (!pUncompressedBuffer) + return false; + + for (int nPos = 0, nUncompressedPos = 0, nLinePos = 0; nPos < lBufLen; nPos += 2) + { + BYTE nCount = pBuffer[nPos]; + BYTE nColor = pBuffer[nPos + 1]; + + if (nCount == 0) + { + // End of line. + if (0 == nColor) + { + if (nLinePos < nStride) + { + int nAdditionalSpace = nStride - nLinePos; + + if (nUncompressedPos + nAdditionalSpace > lUncompressedLen) + break; + + ::memset(pUncompressedBuffer + nUncompressedPos, 0, nAdditionalSpace); + nUncompressedPos += nAdditionalSpace; + } + + nLinePos = 0; + + continue; + } + // End of bitmap. + else if (1 == nColor) + { + break; + } + else + { + // TODO: 2 + break; + } + } + + nLinePos += nCount; + while (nLinePos >= nStride) + { + nLinePos -= nStride; + } + + if (nUncompressedPos + nCount > lUncompressedLen) + break; + + for (int i = 0; i < nCount; ++i) + pUncompressedBuffer[nUncompressedPos + i] = nColor; + + ::memset(pUncompressedBuffer + nUncompressedPos, nColor, nCount); + nUncompressedPos += nCount; + } + + pBuffer = pUncompressedBuffer; + lBufLen = lUncompressedLen; + } + + if (lBufLen < (nWidth + nAdd) * abs(nHeight)) + return false; + + pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; + if (NULL == pBgraBuffer) + return false; + + ulHeight = (unsigned short)abs(nHeight); + ulWidth = (unsigned short)nWidth; + + if (nHeight < 0) + { + for (int nY = 0; nY < abs(nHeight); nY++) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nWidth * nY + nX); + + BYTE nByte = *pBuffer; pBuffer++; lBufLen--; + + pBgraBuffer[nIndex + 0] = oColorTable[nByte].b; + pBgraBuffer[nIndex + 1] = oColorTable[nByte].g; + pBgraBuffer[nIndex + 2] = oColorTable[nByte].r; + pBgraBuffer[nIndex + 3] = 255; + } + pBuffer += nAdd; lBufLen -= nAdd; + } + } + else + { + for (int nY = abs(nHeight) - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nWidth * nY + nX); + + BYTE nByte = *pBuffer; pBuffer++; lBufLen--; + + pBgraBuffer[nIndex + 0] = oColorTable[nByte].b; + pBgraBuffer[nIndex + 1] = oColorTable[nByte].g; + pBgraBuffer[nIndex + 2] = oColorTable[nByte].r; + pBgraBuffer[nIndex + 3] = 255; + } + pBuffer += nAdd; lBufLen -= nAdd; + } + } + + *ppDstBuffer = pBgraBuffer; + *pulWidth = ulWidth; + *pulHeight = ulHeight; + + if (pUncompressedBuffer) + delete[] pUncompressedBuffer; + + return true; + } + else if (BI_BITCOUNT_4 == ushBitCount) + { + unsigned int ulMaskR = 0x1f, ulMaskB = 0x7C00, ulMaskG = 0x3E0; + unsigned int ulShiftR = 0, ulShiftB = 10, ulShiftG = 5; + double dKoefR = 255 / 31.0, dKoefB = 255 / 31.0, dKoefG = 255 / 31.0; + + if (BI_RGB == unCompression) + { + // Маски, сдвиги и коэффициенты уже заполнены стандартными значениями для масок + // 000000000011111 - Red + // 000001111100000 - Green + // 111110000000000 - Blue + } + else if (BI_BITFIELDS == unCompression) + { + oHeaderStream >> ulMaskB; + oHeaderStream >> ulMaskG; + oHeaderStream >> ulMaskR; + + ulShiftR = GetLowestBit(ulMaskR); + ulShiftB = GetLowestBit(ulMaskB); + ulShiftG = GetLowestBit(ulMaskG); + + dKoefR = 255.0 / (ulMaskR >> ulShiftR); + dKoefG = 255.0 / (ulMaskG >> ulShiftG); + dKoefB = 255.0 / (ulMaskB >> ulShiftB); + } + else + return false; + + // Считываем саму картинку + int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); + if (lCalcLen != lBufLen) + return false; + + // 2 байт на все каналы канал + // (Ширина * 3) должна быть кратна 4. + int nAdd = 0; + while (0 != div_t(div(2 * nWidth + nAdd, 4)).rem) + { + nAdd++; + } + + pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; + if (NULL == pBgraBuffer) + return false; + + ulHeight = (unsigned short)abs(nHeight); + ulWidth = (unsigned short)nWidth; + + if (nHeight < 0) + { + for (int nY = 0; nY < abs(nHeight); nY++) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nWidth * nY + nX); + + unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 0xFFFF; pBuffer += 2; lBufLen -= 2; + + unsigned char unR = (ushValue & ulMaskR) >> ulShiftR; + unsigned char unG = (ushValue & ulMaskG) >> ulShiftG; + unsigned char unB = (ushValue & ulMaskB) >> ulShiftB; + + pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); + pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); + pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); + pBgraBuffer[nIndex + 3] = 255; + } + pBuffer += nAdd; lBufLen -= nAdd; + } + } + else + { + for (int nY = abs(nHeight) - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nWidth * nY + nX); + + unsigned short ushValue = ((pBuffer[1] << 8) | pBuffer[0]) & 0xFFFF; pBuffer += 2; lBufLen -= 2; + unsigned char unR = (ushValue & ulMaskR) >> ulShiftR; + unsigned char unG = (ushValue & ulMaskG) >> ulShiftG; + unsigned char unB = (ushValue & ulMaskB) >> ulShiftB; + + pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); + pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); + pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); + pBgraBuffer[nIndex + 3] = 255; + } + pBuffer += nAdd; lBufLen -= nAdd; + } + } + + *ppDstBuffer = pBgraBuffer; + *pulWidth = ulWidth; + *pulHeight = ulHeight; + + return false; + } + else if (BI_BITCOUNT_5 == ushBitCount) + { + if (BI_RGB != unCompression) + return false; // TODO: Сделать данный вариант, как только будет файлы с данным типом + + // Считываем саму картинку + int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); + if (lCalcLen != lBufLen) + return false; + + // 1 байт на каждый канал + // (Ширина * 3) должна быть кратна 4. + int nAdd = 0; + while (0 != div_t(div(3 * nWidth + nAdd, 4)).rem) + { + nAdd++; + } + + int nSize = nWidth * nHeight * 4; + + pBgraBuffer = new BYTE[nWidth * abs(nHeight) * 4 * sizeof(BYTE)]; + if (NULL == pBgraBuffer) + return false; + + ulHeight = (unsigned short)abs(nHeight); + ulWidth = (unsigned short)nWidth; + + if (nHeight < 0) + { + for (int nY = 0; nY < abs(nHeight); nY++) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nWidth * nY + nX); + + pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 3] = 255; + } + pBuffer += nAdd; lBufLen -= nAdd; + } + } + else + { + for (int nY = abs(nHeight) - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * (nWidth * nY + nX); + pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 3] = 255; + } + pBuffer += nAdd; lBufLen -= nAdd; + } + } + + *ppDstBuffer = pBgraBuffer; + *pulWidth = ulWidth; + *pulHeight = ulHeight; + + return true; + } + else if (BI_BITCOUNT_6 == ushBitCount) + { + unsigned int ulMaskR = 0xff000000, ulMaskB = 0x00ff0000, ulMaskG = 0x0000ff00; + unsigned int ulShiftR = 24, ulShiftB = 16, ulShiftG = 8; + double dKoefR = 1.0, dKoefB = 1.0, dKoefG = 1.0; + bool bMask = false; + + if (BI_RGB == unCompression) + { + // Маски, сдвиги и коэффициенты уже заполнены стандартными значениями для масок + } + else if (BI_BITFIELDS == unCompression) + { + if (oHeaderStream.CanRead() < 12) + return false; + + oHeaderStream >> ulMaskB; + oHeaderStream >> ulMaskG; + oHeaderStream >> ulMaskR; + + ulShiftR = GetLowestBit(ulMaskR); + ulShiftB = GetLowestBit(ulMaskB); + ulShiftG = GetLowestBit(ulMaskG); + + dKoefR = 255.0 / (ulMaskR >> ulShiftR); + dKoefG = 255.0 / (ulMaskG >> ulShiftG); + dKoefB = 255.0 / (ulMaskB >> ulShiftB); + + if ((ulMaskR >> ulShiftR) == 255 && (ulMaskG >> ulShiftG) == 255 && (ulMaskB >> ulShiftB) == 255) + { + bMask = false; // Proper_Attire_CALT2.odt + } + else + bMask = true; + } + else + return false; + + // Считываем саму картинку + int lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight); + if (lCalcLen != lBufLen) + return false; + + // 1 байт на каждый канал + // Ширина должна быть кратна 4. + int nAdd = 0; + while (0 != div_t(div(nWidth + nAdd, 4)).rem) + { + nAdd++; + } + + int nSize = nWidth * nHeight * 4; + + pBgraBuffer = new BYTE[(nWidth + nAdd) * abs(nHeight) * 4 * sizeof(BYTE)]; + if (NULL == pBgraBuffer) + return false; + + ulHeight = (unsigned short)abs(nHeight); + ulWidth = (unsigned short)(nWidth + nAdd); + + if (nHeight < 0) + { + for (int nY = 0; nY < abs(nHeight); nY++) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * ((nWidth + nAdd) * nY + nX); + + if (bMask) + { + unsigned int unValue = ((pBuffer[3] << 24) | (pBuffer[2] << 16) | (pBuffer[1] << 8) | pBuffer[0]) & 0xFFFFFFFF; pBuffer += 4; lBufLen -= 4; + + unsigned char unR = (unValue & ulMaskR) >> ulShiftR; + unsigned char unG = (unValue & ulMaskG) >> ulShiftG; + unsigned char unB = (unValue & ulMaskB) >> ulShiftB; + + pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); + pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); + pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); + pBgraBuffer[nIndex + 3] = pBuffer[3]; + } + else + { + pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 3] = 255; pBuffer++; lBufLen--; // Если брать значение из картинки, тогда она получается всегда прозрачной + } + } + for (int nX = nWidth; nX < nWidth + nAdd; nX++) + { + int nIndex = 4 * ((nWidth + nAdd) * nY + nX); + + pBgraBuffer[nIndex + 0] = 255; + pBgraBuffer[nIndex + 1] = 255; + pBgraBuffer[nIndex + 2] = 255; + pBgraBuffer[nIndex + 3] = 0; + } + } + } + else + { + for (int nY = abs(nHeight) - 1; nY >= 0; nY--) + { + for (int nX = 0; nX < nWidth; nX++) + { + int nIndex = 4 * ((nWidth + nAdd) * nY + nX); + if (bMask) + { + unsigned int unValue = ((pBuffer[3] << 24) | (pBuffer[2] << 16) | (pBuffer[1] << 8) | pBuffer[0]) & 0xFFFFFFFF; pBuffer += 4; lBufLen -= 4; + + unsigned char unR = (unValue & ulMaskR) >> ulShiftR; + unsigned char unG = (unValue & ulMaskG) >> ulShiftG; + unsigned char unB = (unValue & ulMaskB) >> ulShiftB; + + pBgraBuffer[nIndex + 0] = (unsigned char)(unR * dKoefR); + pBgraBuffer[nIndex + 1] = (unsigned char)(unG * dKoefG); + pBgraBuffer[nIndex + 2] = (unsigned char)(unB * dKoefB); + pBgraBuffer[nIndex + 3] = pBuffer[3]; + } + else + { + pBgraBuffer[nIndex + 0] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 1] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 2] = pBuffer[0]; pBuffer++; lBufLen--; + pBgraBuffer[nIndex + 3] = 255; pBuffer++; lBufLen--; // Если брать значение из картинки, тогда она получается всегда прозрачной + } + } + + for (int nX = nWidth; nX < nWidth + nAdd; nX++) + { + int nIndex = 4 * ((nWidth + nAdd) * nY + nX); + + pBgraBuffer[nIndex + 0] = 255; + pBgraBuffer[nIndex + 1] = 255; + pBgraBuffer[nIndex + 2] = 255; + pBgraBuffer[nIndex + 3] = 0; + } + + } + } + + *ppDstBuffer = pBgraBuffer; + *pulWidth = ulWidth; + *pulHeight = ulHeight; + + return true; + } + + return false; + } + void ReadImage(BYTE* pHeaderBuffer, unsigned int ulHeaderBufferLen, BYTE* pImageBuffer, unsigned int ulImageBufferLen, BYTE** ppDstBuffer, unsigned int* pulWidth, unsigned int* pulHeight) { if (ulHeaderBufferLen <= 0 || NULL == pHeaderBuffer || NULL == pImageBuffer || ulImageBufferLen < 0) return; diff --git a/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp b/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp index 7ce9c50e38..2e4e7448e1 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp @@ -50,13 +50,14 @@ namespace MetaFile } CEmfLogBrushEx::~CEmfLogBrushEx() { - if (BS_DIBPATTERN == BrushStyle && L"" != DibPatternPath) - { - NSFile::CFileBinary::Remove(DibPatternPath); - } + if (BS_DIBPATTERN == BrushStyle && L"" != DibPatternPath) + { + NSFile::CFileBinary file; + file.Remove(DibPatternPath); + } - if (DibBuffer) - delete[] DibBuffer; + if (DibBuffer) + delete[] DibBuffer; } void CEmfLogBrushEx::SetDibPattern(unsigned char* pBuffer, unsigned int ulWidth, unsigned int ulHeight) { diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp index 5578594ffc..2bbee403c6 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp @@ -57,53 +57,54 @@ namespace MetaFile DibWidth = 0; DibHeigth = 0; } - CWmfBrush::~CWmfBrush() - { - if (BS_DIBPATTERN == BrushStyle && L"" != DibPatternPath) - { - NSFile::CFileBinary::Remove(DibPatternPath); - } + CWmfBrush::~CWmfBrush() + { + if (BS_DIBPATTERN == BrushStyle && L"" != DibPatternPath) + { + NSFile::CFileBinary file; + file.Remove(DibPatternPath); + } - if (DibBuffer) - delete[] DibBuffer; + if (DibBuffer) + delete[] DibBuffer; } - void CWmfBrush::SetDibPattern(unsigned char* pBuffer, unsigned int ulWidth, unsigned int ulHeight) - { - DibBuffer = pBuffer; - DibWidth = ulWidth; - DibHeigth = ulHeight; + void CWmfBrush::SetDibPattern(unsigned char* pBuffer, unsigned int ulWidth, unsigned int ulHeight) + { + DibBuffer = pBuffer; + DibWidth = ulWidth; + DibHeigth = ulHeight; - if (ulWidth <= 0 || ulHeight <= 0) - return; + if (ulWidth <= 0 || ulHeight <= 0) + return; - unsigned int ulBufferSize = 4 * ulWidth * ulHeight; - Aggplus::CImage oImage; - BYTE* pBufferPtr = new BYTE[ulBufferSize]; - oImage.Create(pBufferPtr, ulWidth, ulHeight, 4 * ulWidth); + unsigned int ulBufferSize = 4 * ulWidth * ulHeight; + Aggplus::CImage oImage; + BYTE* pBufferPtr = new BYTE[ulBufferSize]; + oImage.Create(pBufferPtr, ulWidth, ulHeight, 4 * ulWidth); - // Пишем данные в pBufferPtr - for (unsigned int ulIndex = 0; ulIndex < ulBufferSize; ulIndex += 4) - { - pBufferPtr[0] = (unsigned char)pBuffer[ulIndex + 0]; - pBufferPtr[1] = (unsigned char)pBuffer[ulIndex + 1]; - pBufferPtr[2] = (unsigned char)pBuffer[ulIndex + 2]; - pBufferPtr[3] = (unsigned char)pBuffer[ulIndex + 3]; - pBufferPtr += 4; - } + // Пишем данные в pBufferPtr + for (unsigned int ulIndex = 0; ulIndex < ulBufferSize; ulIndex += 4) + { + pBufferPtr[0] = (unsigned char)pBuffer[ulIndex + 0]; + pBufferPtr[1] = (unsigned char)pBuffer[ulIndex + 1]; + pBufferPtr[2] = (unsigned char)pBuffer[ulIndex + 2]; + pBufferPtr[3] = (unsigned char)pBuffer[ulIndex + 3]; + pBufferPtr += 4; + } - FILE *pTempFile = NULL; - std::wstring wsTempFileName; - if (!OpenTempFile(&wsTempFileName, &pTempFile, L"wb", L".emf0", NULL)) - return; + FILE *pTempFile = NULL; + std::wstring wsTempFileName; + if (!OpenTempFile(&wsTempFileName, &pTempFile, L"wb", L".emf0", NULL)) + return; - ::fclose(pTempFile); + ::fclose(pTempFile); - oImage.SaveFile(wsTempFileName, _CXIMAGE_FORMAT_PNG); + oImage.SaveFile(wsTempFileName, _CXIMAGE_FORMAT_PNG); - BrushStyle = BS_DIBPATTERN; - DibPatternPath = wsTempFileName; - } - int CWmfBrush::GetColor() + BrushStyle = BS_DIBPATTERN; + DibPatternPath = wsTempFileName; + } + int CWmfBrush::GetColor() { return METAFILE_RGBA(Color.r, Color.g, Color.b); } diff --git a/DesktopEditor/raster/Metafile/svg/SVGFramework.h b/DesktopEditor/raster/Metafile/svg/SVGFramework.h index 1114600ed6..4cf520bf4c 100644 --- a/DesktopEditor/raster/Metafile/svg/SVGFramework.h +++ b/DesktopEditor/raster/Metafile/svg/SVGFramework.h @@ -4548,7 +4548,8 @@ namespace SVG if (!m_sLivePath.empty()) { - NSFile::CFileBinary::Remove(m_sLivePath); + NSFile::CFileBinary file; + file.Remove(m_sLivePath); } } diff --git a/HtmlFile/HtmlFile.cpp b/HtmlFile/HtmlFile.cpp index 0ab4fa3076..9ea072b945 100644 --- a/HtmlFile/HtmlFile.cpp +++ b/HtmlFile/HtmlFile.cpp @@ -346,6 +346,8 @@ int CHtmlFile::Convert(const std::vector& arFiles, const std::wstr oBuilder.WriteString(L""); + NSFile::CFileBinary file; + std::vector arTmpFiles; for (std::vector::const_iterator iter = arFiles.begin(); iter != arFiles.end(); iter++) { @@ -373,12 +375,14 @@ int CHtmlFile::Convert(const std::vector& arFiles, const std::wstr } std::wstring sTmpFile = NSFile::CFileBinary::CreateTempFileWithUniqueName(sTmpDir, L"HTM"); - if (NSFile::CFileBinary::Exists(sTmpFile)) - NSFile::CFileBinary::Remove(sTmpFile); + + NSFile::CFileBinary file; + if (file.Exists(sTmpFile)) + file.Remove(sTmpFile); sTmpFile = sTmpFile + L".html"; - NSFile::CFileBinary::Copy(sFilePath, sTmpFile); + file.Copy(sFilePath, sTmpFile); oBuilder.WriteEncodeXmlString(CorrectHtmlPath(sTmpFile)); arTmpFiles.push_back(sTmpFile); } @@ -472,7 +476,7 @@ int CHtmlFile::Convert(const std::vector& arFiles, const std::wstr CloseHandle(processinfo.hProcess); CloseHandle(processinfo.hThread); - NSFile::CFileBinary::Remove(sTempFileForParams); + file.Remove(sTempFileForParams); #endif #ifdef LINUX @@ -557,11 +561,12 @@ int CHtmlFile::Convert(const std::vector& arFiles, const std::wstr for (std::vector::iterator i = arTmpFiles.begin(); i != arTmpFiles.end(); i++) { - NSFile::CFileBinary::Remove(*i); + NSFile::CFileBinary file; + file.Remove(*i); } arTmpFiles.clear(); - NSFile::CFileBinary::Remove(sTempFileForParams); + file.Remove(sTempFileForParams); return nReturnCode; } @@ -1069,8 +1074,9 @@ namespace NSMht #endif // под линуксом предыдущая функция создает файл!!! - if (NSFile::CFileBinary::Exists(m_sFolder)) - NSFile::CFileBinary::Remove(m_sFolder); + NSFile::CFileBinary file; + if (file.Exists(m_sFolder)) + file.Remove(m_sFolder); NSDirectory::CreateDirectory(m_sFolder); diff --git a/HtmlRenderer/src/Writer.h b/HtmlRenderer/src/Writer.h index a3a41a1cb4..f84eaef8b1 100644 --- a/HtmlRenderer/src/Writer.h +++ b/HtmlRenderer/src/Writer.h @@ -1175,7 +1175,8 @@ namespace NSHtmlRenderer RELEASEARRAYOBJECTS(pOutput); RELEASEARRAYOBJECTS(pData); - NSFile::CFileBinary::Remove(strTempFont); + NSFile::CFileBinary file; + file.Remove(strTempFont); } NSFile::CFileBinary oFileFontFileJS_type; @@ -2090,7 +2091,8 @@ namespace NSHtmlRenderer oFilePages.CloseFile(); - NSFile::CFileBinary::Remove(m_strDstDirectoryFiles + L"/document_temp.bin"); + NSFile::CFileBinary file; + file.Remove(m_strDstDirectoryFiles + L"/document_temp.bin"); if (bIsNoBase64) {