Files
core/ASCImageStudio3/ASCGraphics/Objects/ASCFontManager.cpp

491 lines
15 KiB
C++

#pragma once
#include "stdafx.h"
#include "AVSFontManager.h"
#include "../Interfaces/AVSGraphicsRenderer.h"
void CAVSFontManager::DumpToJSEditor(CString strDirectory, bool bIsUnionFamily)
{
CreateDirectory(strDirectory, NULL);
CString strFonts = _T("");
int nCount = m_pFontEngine->GetInstalledFontsCount();
// ñíà÷àëà ñòðîèì ìàññèâ âñåõ ôàéëîâ øðèôòîâ
CAtlMap<CString, LONG> mapFontFiles;
CAtlMap<LONG, CString> mapFontFiles2;
LONG lFontFiles = 0;
for (int i = 0; i < nCount; ++i)
{
CWinFontInfo* pInfo = m_pFontEngine->GetInstalledFont(i);
CString strPath = (CString)pInfo->m_wsFontPath;
CAtlMap<CString, LONG>::CPair* pPair = mapFontFiles.Lookup(strPath);
if (NULL == pPair)
{
mapFontFiles.SetAt(strPath, lFontFiles);
mapFontFiles2.SetAt(lFontFiles, strPath);
++lFontFiles;
}
}
// -----------------------------------------
// òåïåðü ñòðîèì ìàññèâ âñåõ øðèôòîâ ïî èìåíè
CAtlMap<CString, CFontInfoJS> mapFonts;
CAtlArray<CString> arrFonts;
for (int i = 0; i < nCount; ++i)
{
CWinFontInfo* pInfo = m_pFontEngine->GetInstalledFont(i);
CString strPath = (CString)pInfo->m_wsFontPath;
CString strName = (CString)pInfo->m_wsFontName;
LONG lFontIndex = 0;
LONG lFaceIndex = 0;
CAtlMap<CString, LONG>::CPair* pPairFontFiles = mapFontFiles.Lookup(strPath);
lFontIndex = pPairFontFiles->m_value;
if (pInfo->m_lIndex >= 0)
lFaceIndex = pInfo->m_lIndex;
CAtlMap<CString, CFontInfoJS>::CPair* pPair = mapFonts.Lookup(pInfo->m_wsFontName);
if (NULL != pPair)
{
pPair->m_value.m_sName = pInfo->m_wsFontName;
if (pInfo->m_bBold && pInfo->m_bItalic)
{
pPair->m_value.m_lIndexBI = lFontIndex;
pPair->m_value.m_lFaceIndexBI = lFaceIndex;
}
else if (pInfo->m_bBold)
{
pPair->m_value.m_lIndexB = lFontIndex;
pPair->m_value.m_lFaceIndexB = lFaceIndex;
}
else if (pInfo->m_bItalic)
{
pPair->m_value.m_lIndexI = lFontIndex;
pPair->m_value.m_lFaceIndexI = lFaceIndex;
}
else
{
pPair->m_value.m_lIndexR = lFontIndex;
pPair->m_value.m_lFaceIndexR = lFaceIndex;
}
}
else
{
CFontInfoJS fontInfo;
fontInfo.m_sName = pInfo->m_wsFontName;
if (pInfo->m_bBold && pInfo->m_bItalic)
{
fontInfo.m_lIndexBI = lFontIndex;
fontInfo.m_lFaceIndexBI = lFaceIndex;
}
else if (pInfo->m_bBold)
{
fontInfo.m_lIndexB = lFontIndex;
fontInfo.m_lFaceIndexB = lFaceIndex;
}
else if (pInfo->m_bItalic)
{
fontInfo.m_lIndexI = lFontIndex;
fontInfo.m_lFaceIndexI = lFaceIndex;
}
else
{
fontInfo.m_lIndexR = lFontIndex;
fontInfo.m_lFaceIndexR = lFaceIndex;
}
mapFonts.SetAt(fontInfo.m_sName, fontInfo);
arrFonts.Add(fontInfo.m_sName);
}
}
// -------------------------------------------
// òåïåðü ñîðòèðóåì øðèôòû ïî èìåíè ----------
size_t nCountFonts = arrFonts.GetCount();
for (size_t i = 0; i < nCountFonts; ++i)
{
for (size_t j = i + 1; j < nCountFonts; ++j)
{
if (arrFonts[i] > arrFonts[j])
{
CString temp = arrFonts[i];
arrFonts[i] = arrFonts[j];
arrFonts[j] = temp;
}
}
}
// -------------------------------------------
// ñîçäàåì êàðòèíêó äëÿ òàáíåéëîâ
double dW_mm = 80;
LONG lH1_px = LONG(7 * 96 / 25.4);
LONG lWidthPix = (LONG)(dW_mm * 96 / 25.4);
LONG lHeightPix = (LONG)(nCountFonts * lH1_px);
MediaCore::IAVSUncompressedVideoFrame* pFrame = NULL;
CoCreateInstance(MediaCore::CLSID_CAVSUncompressedVideoFrame, NULL, CLSCTX_ALL, MediaCore::IID_IAVSUncompressedVideoFrame, (void**)&pFrame);
pFrame->put_ColorSpace( ( 1 << 6) | ( 1 << 31) ); // CPS_BGRA | CPS_FLIP
pFrame->put_Width( lWidthPix );
pFrame->put_Height( lHeightPix );
pFrame->put_AspectRatioX( lWidthPix );
pFrame->put_AspectRatioY( lHeightPix );
pFrame->put_Interlaced( VARIANT_FALSE );
pFrame->put_Stride( 0, 4 * lWidthPix );
pFrame->AllocateBuffer( -1 );
BYTE* pBuffer = NULL;
pFrame->get_Buffer(&pBuffer);
memset(pBuffer, 0xFF, 4 * lWidthPix * lHeightPix);
for (LONG i = 3; i < lWidthPix * lHeightPix * 4; i += 4)
{
pBuffer[i] = 0;
}
IAVSGraphicsRenderer* pRenderer = NULL;
CoCreateInstance(__uuidof(CAVSGraphicsRenderer), NULL, CLSCTX_ALL, __uuidof(IAVSGraphicsRenderer), (void**)&pRenderer);
//ñòàâèì FontManager
IAVSFontManager* man = NULL;
CoCreateInstance(__uuidof(CAVSFontManager), NULL, CLSCTX_INPROC, __uuidof(IAVSFontManager), (void**)&man);
man->Initialize(L"");
man->SetDefaultFont( L"Arial" );
IAVSFontManager2* man2 = NULL;
man->QueryInterface(__uuidof(IAVSFontManager2), (void**)&man2);
man2->UseDefaultFont(TRUE);
RELEASEINTERFACE(man2);
VARIANT vtVariant;
vtVariant.vt = VT_UNKNOWN;
vtVariant.punkVal = (IUnknown*)man;
pRenderer->SetAdditionalParam( L"FontManager", vtVariant );
pRenderer->put_Width(dW_mm);
pRenderer->put_Height(lHeightPix * 25.4 / 96);
pRenderer->CreateFromMediaData((IUnknown*)pFrame, 0, 0, lWidthPix, lHeightPix);
// ñêèäûâàåì ôàéëû øðèôòîâ (â âèäå ñêðèïòîâ)
POSITION pos = mapFontFiles.GetStartPosition();
while (NULL != pos)
{
const CAtlMap<CString, LONG>::CPair* pPair = mapFontFiles.GetNext(pos);
DumpJSFontFile6(pPair->m_key, strDirectory, pPair->m_value);
}
// -------------------------------------------
// ñêèäûâàì âñå íàçâàíèÿ øðèôòîâ (÷òîáû ëåãêî âñòàâèòü â êîìáîáîêñ)
if (TRUE)
{
for (size_t i = 0; i < nCountFonts; ++i)
{
strFonts += arrFonts[i];
strFonts += _T("\n");
}
CStringA strA = (CStringA)strFonts;
CFile oFileNames;
oFileNames.CreateFile(strDirectory + _T("\\Fonts_JS") + _T("\\AllFontNames.txt"));
oFileNames.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
oFileNames.CloseFile();
}
// è ñàìîå ãëàâíîå. Çäåñü äîëæåí ñêèäûâàòüñÿ ñêðèïò äëÿ ðàáîòû ñî âñåìè øðèôòàìè.
// âñå îáúåêòû, êîòîðûå ïîçâîëÿò íå çíàòü î ñóùåñòâóþùèõ ôîíòàõ
if (TRUE)
{
#if 0
BOOL bIsUSE_ORIGINAL_FONTS = TRUE;
CStringWriter oWriterJS;
//var g_fontFiles = new Array();
CString strArrayFonts = _T("");
strArrayFonts.Format(_T("var _files = new Array(%d);\n"), lFontFiles);
oWriterJS.WriteString(strArrayFonts);
// ñíà÷àëà âñå ôàéëû
pos = mapFontFiles.GetStartPosition();
while (NULL != pos)
{
const CAtlMap<CString, LONG>::CPair* pPair = mapFontFiles.GetNext(pos);
CString strFontId = pPair->m_key;
CString strNum = _T("");
strNum.Format(_T("%d"), pPair->m_value);
strFontId.Replace(_T("\\\\"), _T("\\"));
strFontId.Replace(_T("/"), _T("\\"));
int nStart = strFontId.ReverseFind('\\');
int nEnd = strFontId.ReverseFind('.');
if (bIsUSE_ORIGINAL_FONTS)
strFontId = strFontId.Mid(nStart + 1);
else
{
strFontId = strFontId.Mid(nStart + 1, nEnd - nStart - 1);
strFontId += _T(".js");
}
CString str1 = _T("_files[") + strNum + _T("] = new CFontFileLoader(\"") + strFontId + _T("\");\n");
oWriterJS.WriteString(str1);
}
oWriterJS.WriteStringC(_T("\n"));
CString strArrayInit = _T("");
strArrayInit.Format(_T("var _infos = new Array(%d);\n"), nCountFonts);
oWriterJS.WriteString(strArrayInit);
for (int index = 0; index < nCountFonts; ++index)
{
const CAtlMap<CString, CFontInfoJS>::CPair* pPair = mapFonts.Lookup(arrFonts[index]);
CString str1 = _T("");
str1.Format(_T("_infos[%d] = new CFontInfo(\""), index);
str1 += pPair->m_value.m_sName;
str1 += _T("\"");
CString strParams = _T("");
strParams.Format(_T(",%d,0,%d,%d,%d,%d,%d,%d,%d,%d);\n"), index, pPair->m_value.m_lIndexR, pPair->m_value.m_lFaceIndexR,
pPair->m_value.m_lIndexI, pPair->m_value.m_lFaceIndexI,
pPair->m_value.m_lIndexB, pPair->m_value.m_lFaceIndexB,
pPair->m_value.m_lIndexBI, pPair->m_value.m_lFaceIndexBI);
oWriterJS.WriteString(str1);
oWriterJS.WriteString(strParams);
// thumbnail
LONG lFontIndex = 0;
LONG lFaceIndex = 0;
if (pPair->m_value.m_lIndexR != -1)
{
lFontIndex = pPair->m_value.m_lIndexR;
lFaceIndex = pPair->m_value.m_lFaceIndexR;
}
else if (pPair->m_value.m_lIndexI != -1)
{
lFontIndex = pPair->m_value.m_lIndexI;
lFaceIndex = pPair->m_value.m_lFaceIndexI;
}
else if (pPair->m_value.m_lIndexI != -1)
{
lFontIndex = pPair->m_value.m_lIndexB;
lFaceIndex = pPair->m_value.m_lFaceIndexB;
}
else if (pPair->m_value.m_lIndexBI != -1)
{
lFontIndex = pPair->m_value.m_lIndexBI;
lFaceIndex = pPair->m_value.m_lFaceIndexBI;
}
CString strFontPath = _T("");
CAtlMap<LONG, CString>::CPair* _pair = mapFontFiles2.Lookup(lFontIndex);
if (NULL != _pair)
strFontPath = _pair->m_value;
BSTR bsFontPath = strFontPath.AllocSysString();
LoadFontFromFile(bsFontPath, 10, 72, 72, lFaceIndex);
BOOL bIsSymbol = (-1 != ((CFreeTypeFont*)m_pFont)->GetSymbolic()) ? TRUE : FALSE;
if (bIsSymbol)
{
SysFreeString(bsFontPath);
strFontPath = _T("C:\\Windows\\Fonts\\cour.ttf");
bsFontPath = strFontPath.AllocSysString();
}
pRenderer->put_BrushColor1(0);
BSTR bsText = pPair->m_value.m_sName.AllocSysString();
pRenderer->put_FontPath(bsFontPath);
pRenderer->put_FontSize(14);
pRenderer->put_FontStringGID(0);
pRenderer->put_FontCharSpace(0);
pRenderer->CommandDrawText(bsText, 5, 25.4 * (index * lH1_px + lH1_px) / 96 - 2, 0, 0, 0);
SysFreeString(bsText);
SysFreeString(bsFontPath);
// endthumbnail
}
oWriterJS.WriteStringC(_T("\n"));
oWriterJS.WriteStringC(_T("var _maps = {};\n"));
for (int i = 0; i < nCountFonts; ++i)
{
CString sNum = _T("");
sNum.Format(_T("\"] = %d;\n"), i);
oWriterJS.WriteStringC(_T("_maps[\""));
oWriterJS.WriteStringC(arrFonts[i]);
oWriterJS.WriteStringC(sNum);
}
#else
CStringWriter oWriterJS;
// ñíà÷àëà âñå ôàéëû
size_t nCountFiles = mapFontFiles.GetCount();
if (nCountFiles == 0)
oWriterJS.WriteStringC(_T("window[\"__fonts_files\"] = []; \n\n"));
else
{
pos = mapFontFiles.GetStartPosition();
CString* pMassFiles = new CString[nCountFiles];
while (NULL != pos)
{
const CAtlMap<CString, LONG>::CPair* pPair = mapFontFiles.GetNext(pos);
CString strFontId = pPair->m_key;
strFontId.Replace(_T("\\\\"), _T("\\"));
strFontId.Replace(_T("/"), _T("\\"));
int nStart = strFontId.ReverseFind('\\');
strFontId = strFontId.Mid(nStart + 1);
pMassFiles[pPair->m_value] = strFontId;
}
oWriterJS.WriteStringC(_T("window[\"__fonts_files\"] = [\n"));
for (size_t nIndex = 0; nIndex < nCountFiles; ++nIndex)
{
oWriterJS.WriteStringC(_T("\""));
oWriterJS.WriteString(pMassFiles[nIndex]);
if (nIndex != (nCountFiles - 1))
oWriterJS.WriteStringC(_T("\",\n"));
else
oWriterJS.WriteStringC(_T("\""));
}
oWriterJS.WriteStringC(_T("\n];\n\n"));
RELEASEARRAYOBJECTS(pMassFiles);
}
CString strArrayInit = _T("");
strArrayInit.Format(_T("window[\"__fonts_infos\"] = [\n"), nCountFonts);
oWriterJS.WriteString(strArrayInit);
for (int index = 0; index < nCountFonts; ++index)
{
const CAtlMap<CString, CFontInfoJS>::CPair* pPair = mapFonts.Lookup(arrFonts[index]);
CString str1 = _T("");
str1.Format(_T("[\""), index);
str1 += pPair->m_value.m_sName;
CString strParams = _T("");
strParams.Format(_T("\",%d,%d,%d,%d,%d,%d,%d,%d]"), pPair->m_value.m_lIndexR, pPair->m_value.m_lFaceIndexR,
pPair->m_value.m_lIndexI, pPair->m_value.m_lFaceIndexI,
pPair->m_value.m_lIndexB, pPair->m_value.m_lFaceIndexB,
pPair->m_value.m_lIndexBI, pPair->m_value.m_lFaceIndexBI);
oWriterJS.WriteString(str1);
oWriterJS.WriteString(strParams);
if (index != (nCountFonts - 1))
oWriterJS.WriteStringC(_T(",\n"));
else
oWriterJS.WriteStringC(_T("\n"));
// thumbnail
LONG lFontIndex = 0;
LONG lFaceIndex = 0;
if (pPair->m_value.m_lIndexR != -1)
{
lFontIndex = pPair->m_value.m_lIndexR;
lFaceIndex = pPair->m_value.m_lFaceIndexR;
}
else if (pPair->m_value.m_lIndexI != -1)
{
lFontIndex = pPair->m_value.m_lIndexI;
lFaceIndex = pPair->m_value.m_lFaceIndexI;
}
else if (pPair->m_value.m_lIndexI != -1)
{
lFontIndex = pPair->m_value.m_lIndexB;
lFaceIndex = pPair->m_value.m_lFaceIndexB;
}
else if (pPair->m_value.m_lIndexBI != -1)
{
lFontIndex = pPair->m_value.m_lIndexBI;
lFaceIndex = pPair->m_value.m_lFaceIndexBI;
}
CString strFontPath = _T("");
CAtlMap<LONG, CString>::CPair* _pair = mapFontFiles2.Lookup(lFontIndex);
if (NULL != _pair)
strFontPath = _pair->m_value;
BSTR bsFontPath = strFontPath.AllocSysString();
LoadFontFromFile(bsFontPath, 10, 72, 72, lFaceIndex);
BOOL bIsSymbol = (-1 != ((CFreeTypeFont*)m_pFont)->GetSymbolic()) ? TRUE : FALSE;
if (bIsSymbol)
{
SysFreeString(bsFontPath);
strFontPath = _T("C:\\Windows\\Fonts\\cour.ttf");
bsFontPath = strFontPath.AllocSysString();
}
pRenderer->put_BrushColor1(0);
BSTR bsText = pPair->m_value.m_sName.AllocSysString();
pRenderer->put_FontPath(bsFontPath);
pRenderer->put_FontSize(14);
pRenderer->put_FontStringGID(0);
pRenderer->put_FontCharSpace(0);
pRenderer->CommandDrawText(bsText, 5, 25.4 * (index * lH1_px + lH1_px) / 96 - 2, 0, 0, 0);
SysFreeString(bsText);
SysFreeString(bsFontPath);
// endthumbnail
}
oWriterJS.WriteStringC(_T("];\n\n"));
#endif
// ñêèíåì òàáíåéë
ImageStudio::IImageTransforms* pTransform = NULL;
CoCreateInstance(ImageStudio::CLSID_ImageTransforms, NULL, CLSCTX_ALL, ImageStudio::IID_IImageTransforms, (void**)&pTransform);
VARIANT var;
var.vt = VT_UNKNOWN;
var.punkVal = (IUnknown*)pFrame;
CString strThumbnailPath = strDirectory + _T("\\Fonts_JS") + _T("\\thumbnail.png");
VARIANT_BOOL vbSuccess = VARIANT_FALSE;
CString _dst = _T("<ImageFile-SaveAsPng destinationpath=\"") + strThumbnailPath + _T("\" format=\"8888\"/>");
BSTR bs_dst = _dst.AllocSysString();
pTransform->SetSource(0, var);
pTransform->SetXml(bs_dst, &vbSuccess);
pTransform->Transform(&vbSuccess);
RELEASEINTERFACE(pRenderer);
RELEASEINTERFACE(pFrame);
RELEASEINTERFACE(pTransform);
CFile oImageFile;
oImageFile.OpenFile(strThumbnailPath);
int nInputLen = (int)oImageFile.GetFileSize();
BYTE* pData = new BYTE[nInputLen];
oImageFile.ReadFile(pData, nInputLen);
oImageFile.CloseFile();
int nOutputLen = Base64EncodeGetRequiredLength(nInputLen, ATL_BASE64_FLAG_NOCRLF);
BYTE* pOutput = new BYTE[nOutputLen];
Base64Encode(pData, nInputLen, (LPSTR)pOutput, &nOutputLen, ATL_BASE64_FLAG_NOCRLF);
CString _s((char*)pOutput, nOutputLen);
oWriterJS.WriteStringC(_T("window[\"g_standart_fonts_thumbnail\"] = \"data:image/png;base64,"));
oWriterJS.WriteStringC(_s);
oWriterJS.WriteStringC(_T("\";\n"));
CStringA strA = (CStringA)oWriterJS.GetCString();
CFile oFileFontsJS;
oFileFontsJS.CreateFile(strDirectory + _T("\\Fonts_JS") + _T("\\AllFonts.js"));
oFileFontsJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
oFileFontsJS.CloseFile();
}
}