302 lines
7.4 KiB
C++
302 lines
7.4 KiB
C++
|
|
|
|
#ifdef MACOSX
|
|
#ifndef __LP64__
|
|
|
|
//Toonz stuff
|
|
#include "tvectorimage.h"
|
|
#include "tstroke.h"
|
|
#include "traster.h"
|
|
#include "tfont.h"
|
|
|
|
//Qt stuff
|
|
#include <QString>
|
|
#include <QSharedMemory>
|
|
#include <QDebug>
|
|
|
|
//tipc includes
|
|
#include "tipc.h"
|
|
#include "tipcmsg.h"
|
|
#include "tipcsrv.h"
|
|
|
|
#include "t32fontmsg.h"
|
|
|
|
//---------------------------------------------------
|
|
|
|
// Local namespace stuff
|
|
|
|
namespace
|
|
{
|
|
}
|
|
|
|
QDataStream &operator<<(QDataStream &ds, const TThickPoint &p)
|
|
{
|
|
ds << p.x << p.y << p.thick;
|
|
return ds;
|
|
}
|
|
|
|
//---------------------------------------------------
|
|
|
|
using namespace tipc;
|
|
|
|
namespace font_io
|
|
{
|
|
|
|
void addParsers(tipc::Server *srv)
|
|
{
|
|
srv->addParser(new LoadFontNamesParser);
|
|
srv->addParser(new GetAllFamiliesParser);
|
|
srv->addParser(new GetAllTypefacesParser);
|
|
srv->addParser(new SetFamilyParser);
|
|
srv->addParser(new SetTypefaceParser);
|
|
srv->addParser(new SetSizeParser);
|
|
srv->addParser(new GetCurrentFamilyParser);
|
|
srv->addParser(new GetCurrentTypefaceParser);
|
|
srv->addParser(new GetDistanceParser);
|
|
srv->addParser(new DrawCharVIParser);
|
|
srv->addParser(new DrawCharGRParser);
|
|
srv->addParser(new DrawCharCMParser);
|
|
}
|
|
|
|
//************************************************************************
|
|
// LoadFontNames Parser
|
|
//************************************************************************
|
|
|
|
void LoadFontNamesParser::operator()(Message &msg)
|
|
{
|
|
TFontManager::instance()->loadFontNames();
|
|
msg << clr << QString("ok");
|
|
}
|
|
|
|
//************************************************************************
|
|
// GetAllFamilies Parser
|
|
//************************************************************************
|
|
|
|
void GetAllFamiliesParser::operator()(Message &msg)
|
|
{
|
|
std::vector<std::wstring> families;
|
|
TFontManager::instance()->getAllFamilies(families);
|
|
|
|
msg << clr << QString("ok") << families;
|
|
}
|
|
|
|
//************************************************************************
|
|
// GetAllTypefaces Parser
|
|
//************************************************************************
|
|
|
|
void GetAllTypefacesParser::operator()(Message &msg)
|
|
{
|
|
std::vector<std::wstring> typefaces;
|
|
TFontManager::instance()->getAllTypefaces(typefaces);
|
|
|
|
msg << clr << QString("ok") << typefaces;
|
|
}
|
|
|
|
//************************************************************************
|
|
// SetFamily Parser
|
|
//************************************************************************
|
|
|
|
void SetFamilyParser::operator()(Message &msg)
|
|
{
|
|
std::wstring family;
|
|
msg >> family >> clr;
|
|
|
|
TFontManager::instance()->setFamily(family);
|
|
msg << QString("ok");
|
|
}
|
|
|
|
//************************************************************************
|
|
// SetTypeface Parser
|
|
//************************************************************************
|
|
|
|
void SetTypefaceParser::operator()(Message &msg)
|
|
{
|
|
std::wstring typeface;
|
|
msg >> typeface >> clr;
|
|
|
|
TFontManager *fm = TFontManager::instance();
|
|
fm->setTypeface(typeface);
|
|
msg << QString("ok")
|
|
<< fm->getLineAscender()
|
|
<< fm->getLineDescender();
|
|
}
|
|
|
|
//************************************************************************
|
|
// SetSize Parser
|
|
//************************************************************************
|
|
|
|
void SetSizeParser::operator()(Message &msg)
|
|
{
|
|
int size;
|
|
msg >> size >> clr;
|
|
|
|
TFontManager *fm = TFontManager::instance();
|
|
fm->setSize(size);
|
|
msg << QString("ok")
|
|
<< fm->getLineAscender()
|
|
<< fm->getLineDescender();
|
|
}
|
|
|
|
//************************************************************************
|
|
// GetCurrentFamily Parser
|
|
//************************************************************************
|
|
|
|
void GetCurrentFamilyParser::operator()(Message &msg)
|
|
{
|
|
std::wstring family(TFontManager::instance()->getCurrentFamily());
|
|
msg << clr << QString("ok") << family;
|
|
}
|
|
|
|
//************************************************************************
|
|
// GetCurrentTypeface Parser
|
|
//************************************************************************
|
|
|
|
void GetCurrentTypefaceParser::operator()(Message &msg)
|
|
{
|
|
std::wstring typeface(TFontManager::instance()->getCurrentTypeface());
|
|
msg << clr << QString("ok") << typeface;
|
|
}
|
|
|
|
//************************************************************************
|
|
// GetDistance Parser
|
|
//************************************************************************
|
|
|
|
void GetDistanceParser::operator()(Message &msg)
|
|
{
|
|
wchar_t firstChar, secondChar;
|
|
msg >> firstChar >> secondChar >> clr;
|
|
|
|
TPoint dist = TFontManager::instance()->getDistance(firstChar, secondChar);
|
|
msg << QString("ok") << dist.x << dist.y;
|
|
}
|
|
|
|
//************************************************************************
|
|
// DrawCharVI Parser
|
|
//************************************************************************
|
|
|
|
void DrawCharVIParser::operator()(Message &msg)
|
|
{
|
|
wchar_t charCode, nextCode;
|
|
msg >> charCode >> nextCode >> clr;
|
|
|
|
TVectorImageP vi(new TVectorImage);
|
|
|
|
TPoint p = TFontManager::instance()->drawChar(vi, charCode, nextCode);
|
|
msg << QString("ok") << p.x << p.y;
|
|
|
|
//Write the vector image
|
|
std::vector<TThickPoint> cps;
|
|
|
|
unsigned int i, strokesCount = vi->getStrokeCount();
|
|
for (i = 0; i < strokesCount; ++i) {
|
|
TStroke *stroke = vi->getStroke(i);
|
|
|
|
cps.clear();
|
|
stroke->getControlPoints(cps);
|
|
|
|
msg << cps;
|
|
}
|
|
}
|
|
|
|
//************************************************************************
|
|
// DrawCharGR Parser
|
|
//************************************************************************
|
|
|
|
void DrawCharGRParser::operator()(Message &msg)
|
|
{
|
|
int ink;
|
|
QString shMemId;
|
|
wchar_t charCode, nextCode;
|
|
msg >> ink >> shMemId >> charCode >> nextCode >> clr;
|
|
|
|
//Build the character
|
|
TRasterGR8P charRas;
|
|
TPoint unused;
|
|
TPoint p = TFontManager::instance()->drawChar(charRas, unused, charCode, nextCode);
|
|
|
|
//Retrieve the raster size
|
|
int lx = charRas->getLx(), ly = charRas->getLy();
|
|
int size = lx * ly * sizeof(TPixelGR8);
|
|
|
|
//Request a shared memory segment of that size
|
|
{
|
|
tipc::DefaultMessageParser<SHMEM_REQUEST> msgParser;
|
|
Message shMsg;
|
|
|
|
shMsg << shMemId << size << reset;
|
|
msgParser(shMsg);
|
|
|
|
QString str;
|
|
shMsg >> reset >> str;
|
|
if (str != QString("ok")) {
|
|
msg << QString("err");
|
|
return;
|
|
}
|
|
}
|
|
|
|
//Copy charRas to the shared segment
|
|
QSharedMemory shmem(shMemId);
|
|
shmem.attach();
|
|
shmem.lock();
|
|
|
|
memcpy(shmem.data(), charRas->getRawData(), size);
|
|
|
|
shmem.unlock();
|
|
shmem.detach();
|
|
|
|
msg << QString("ok") << lx << ly << p.x << p.y;
|
|
}
|
|
|
|
//************************************************************************
|
|
// DrawCharCM Parser
|
|
//************************************************************************
|
|
|
|
void DrawCharCMParser::operator()(Message &msg)
|
|
{
|
|
int ink;
|
|
QString shMemId;
|
|
wchar_t charCode, nextCode;
|
|
msg >> ink >> shMemId >> charCode >> nextCode >> clr;
|
|
|
|
//Build the character
|
|
TRasterCM32P charRas;
|
|
TPoint unused;
|
|
TPoint p = TFontManager::instance()->drawChar(charRas, unused, ink, charCode, nextCode);
|
|
|
|
//Retrieve the raster size
|
|
int lx = charRas->getLx(), ly = charRas->getLy();
|
|
int size = lx * ly * sizeof(TPixelCM32);
|
|
|
|
//Request a shared memory segment of that size
|
|
{
|
|
tipc::DefaultMessageParser<SHMEM_REQUEST> msgParser;
|
|
Message shMsg;
|
|
|
|
shMsg << shMemId << size << reset;
|
|
msgParser(shMsg);
|
|
|
|
QString str;
|
|
shMsg >> reset >> str;
|
|
if (str != QString("ok")) {
|
|
msg << QString("err");
|
|
return;
|
|
}
|
|
}
|
|
|
|
//Copy charRas to the shared segment
|
|
QSharedMemory shmem(shMemId);
|
|
shmem.attach();
|
|
shmem.lock();
|
|
|
|
memcpy(shmem.data(), charRas->getRawData(), size);
|
|
|
|
shmem.unlock();
|
|
shmem.detach();
|
|
|
|
msg << QString("ok") << lx << ly << p.x << p.y;
|
|
}
|
|
|
|
} //namespace font_io
|
|
|
|
#endif // !__LP64
|
|
#endif // MACOSX
|