#ifdef __LP64__ //Toonz includes #include "tvectorimage.h" #include "tstroke.h" #include "trop.h" //Qt includes #include /* なぜか tipc.h の template QDataStream& operator>>(QDataStream& ds, std::vector& vec) が T=TThickPoint でインスタンス化されようとして曖昧ですエラーになる */ //tipc includes #include "tipc.h" #include "t32bitsrv_wrap.h" #include "tfont.h" //************************************************************************** // Local namespace stuff //************************************************************************** namespace { QDataStream &operator>>(QDataStream &ds, TThickPoint &p) { return ds >> p.x >> p.y >> p.thick; } void readVImage(TVectorImageP &vi, tipc::Message &msg) { std::vector strokeCPs; //Read in all strokes while (!msg.ds().atEnd()) { strokeCPs.clear(); msg >> strokeCPs; vi->addStroke(new TStroke(strokeCPs)); } vi->group(0, vi->getStrokeCount()); } } //namespace //************************************************************************** // TFontManager Private stuff //************************************************************************** /* The proxied Impl private just caches some data of the actual background counterpart */ struct TFontManager::Impl { int m_ascender; int m_descender; Impl() {} ~Impl() {} }; //************************************************************************** // TFontManager Proxied implementation //************************************************************************** TFontManager::TFontManager() { m_pimpl = new TFontManager::Impl(); } //-------------------------------------------------------------- TFontManager::~TFontManager() { delete m_pimpl; } //-------------------------------------------------------------- TFontManager *TFontManager::instance() { static TFontManager theInstance; return &theInstance; } //-------------------------------------------------------------- //!This function is retained from old 32-bit legacy code. //!Its use is now forbidden - use the TFontManager directly instead. TFont *TFontManager::getCurrentFont() { assert(false); return 0; } //-------------------------------------------------------------- //!\note Throws TFontLibraryLoadingError if fonts could not be loaded void TFontManager::loadFontNames() { //Connect to the 32-bit background server process QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTloadFontNames")); if (tipc::readMessage(stream, msg) != "ok") throw TFontLibraryLoadingError(); } //-------------------------------------------------------------- //!\note Throws TFontCreationError if the font could not be created, and //!leaves the old font as current. void TFontManager::setFamily(const wstring family) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTsetFamily") << family); if (tipc::readMessage(stream, msg) != "ok") throw TFontCreationError(); } //-------------------------------------------------------------- //!\note Throws TFontCreationError if the font could not be created, and //!leaves the old font as current. void TFontManager::setTypeface(const wstring typeface) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTsetTypeface") << typeface); if (tipc::readMessage(stream, msg) != "ok") throw TFontCreationError(); //Also, store the font's ascender and descender msg >> m_pimpl->m_ascender >> m_pimpl->m_descender; } //-------------------------------------------------------------- wstring TFontManager::getCurrentFamily() const { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTgetCurrentFamily")); if (tipc::readMessage(stream, msg) != "ok") throw TException("Could not get font family"); std::wstring family; msg >> family; return family; } //-------------------------------------------------------------- wstring TFontManager::getCurrentTypeface() const { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTgetCurrentTypeface")); if (tipc::readMessage(stream, msg) != "ok") throw TException("Could not get font typeface"); std::wstring typeface; msg >> typeface; return typeface; } //-------------------------------------------------------------- void TFontManager::getAllFamilies(vector &families) const { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTgetAllFamilies")); if (tipc::readMessage(stream, msg) != "ok") throw TException("Could not get font families"); msg >> families; } //-------------------------------------------------------------- void TFontManager::getAllTypefaces(vector &typefaces) const { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTgetAllTypefaces")); if (tipc::readMessage(stream, msg) != "ok") throw TException("Could not get font typefaces"); msg >> typefaces; } //-------------------------------------------------------------- void TFontManager::setVertical(bool vertical) { } //-------------------------------------------------------------- void TFontManager::setSize(int size) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTsetSize") << size); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); //Also, update ascender and descender msg >> m_pimpl->m_ascender >> m_pimpl->m_descender; } //-------------------------------------------------------------- TPoint TFontManager::getDistance(wchar_t firstChar, wchar_t secondChar) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTgetDistance") << firstChar << secondChar); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); TPoint d; msg >> d.x >> d.y; return d; } //-------------------------------------------------------------- int TFontManager::getMaxHeight() { return m_pimpl->m_ascender - m_pimpl->m_descender; } //-------------------------------------------------------------- int TFontManager::getMaxWidth() { assert(!"not implemented yet"); return 100; } //-------------------------------------------------------------- bool TFontManager::hasVertical() { return false; } //-------------------------------------------------------------- bool TFontManager::hasKerning() { return true; } //-------------------------------------------------------------- int TFontManager::getLineAscender() { return m_pimpl->m_ascender; } //-------------------------------------------------------------- int TFontManager::getLineDescender() { return m_pimpl->m_descender; } //-------------------------------------------------------------- TPoint TFontManager::drawChar(TVectorImageP &outImage, wchar_t charcode, wchar_t nextCode) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; stream << (msg << QString("$FNTdrawCharVI") << charcode << nextCode); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); TPoint ret; msg >> ret.x >> ret.y; ::readVImage(outImage, msg); return ret; } //-------------------------------------------------------------- TPoint TFontManager::drawChar(TRasterGR8P &outImage, TPoint &glyphOrigin, wchar_t charcode, wchar_t nextCode) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; QString shMemId(tipc::uniqueId()), res; { //Invoke the appropriate command stream << (msg << QString("$FNTdrawCharGR") << shMemId << charcode << nextCode); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); } TDimension dim(0, 0); msg >> dim.lx >> dim.ly; TPoint ret; msg >> ret.x >> ret.y; //Create outImage outImage = TRasterGR8P(dim.lx, dim.ly); QSharedMemory shmem(shMemId); shmem.attach(); shmem.lock(); //Copy the returned image to outImage TRasterGR8P ras(dim.lx, dim.ly, dim.lx, (TPixelGR8 *)shmem.data()); TRop::copy(outImage, ras); shmem.unlock(); shmem.detach(); //Release the shared segment stream << (msg << tipc::clr << QString("$shmem_release") << shMemId); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); return ret; } //-------------------------------------------------------------- TPoint TFontManager::drawChar(TRasterCM32P &outImage, TPoint &glyphOrigin, int inkId, wchar_t charcode, wchar_t nextCode) { QLocalSocket socket; tipc::startSlaveConnection(&socket, t32bitsrv::srvName(), -1, t32bitsrv::srvCmdline()); tipc::Stream stream(&socket); tipc::Message msg; QString shMemId(tipc::uniqueId()), res; { //Invoke the appropriate command stream << (msg << QString("$FNTdrawCharCM") << inkId << shMemId << charcode << nextCode); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); } TDimension dim(0, 0); msg >> dim.lx >> dim.ly; TPoint ret; msg >> ret.x >> ret.y; //Create outImage outImage = TRasterCM32P(dim.lx, dim.ly); QSharedMemory shmem(shMemId); shmem.attach(); shmem.lock(); //Copy the returned image to outImage TRasterCM32P ras(dim.lx, dim.ly, dim.lx, (TPixelCM32 *)shmem.data()); TRop::copy(outImage, ras); shmem.unlock(); shmem.detach(); //Release the shared segment stream << (msg << tipc::clr << QString("$shmem_release") << shMemId); if (tipc::readMessage(stream, msg) != "ok") throw TException("Unexpected error"); return ret; } #endif