1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2024-11-08 16:57:16 +01:00
SqMod/vendor/POCO/PDF/src/Cell.cpp
Sandu Liviu Catalin 4a6bfc086c Major plugin refactor and cleanup.
Switched to POCO library for unified platform/library interface.
Deprecated the external module API. It was creating more problems than solving.
Removed most built-in libraries in favor of system libraries for easier maintenance.
Cleaned and secured code with help from static analyzers.
2021-01-30 08:51:39 +02:00

165 lines
4.4 KiB
C++

//
// Cell.cpp
//
#include "Poco/PDF/Cell.h"
namespace Poco {
namespace PDF {
Cell::Cell(const AttributedString& content, const std::string& name, FontMapPtr pFontMap):
_content(content),
_name(name),
_outline(OUTLINE_NONE),
_lineWidth(1.0f),
_encoding("UTF-8"),
_trueType(true),
_widthAsPct(-1)
{
setFonts(pFontMap);
}
Cell::Cell(const AttributedString& content, FontMapPtr pFontMap, const std::string& encoding, bool trueType, int widthAsPct):
_content(content),
_outline(OUTLINE_NONE),
_lineWidth(1.0f),
_encoding(encoding),
_trueType(trueType),
_widthAsPct(widthAsPct)
{
setFonts(pFontMap);
}
Cell::~Cell()
{
}
void Cell::setFonts(FontMapPtr pFontMap)
{
_pFontMap = pFontMap;
if (_pFontMap) poco_assert(_pFontMap->size() == 4);
}
void Cell::borderTopBottom(bool show)
{
borderTop(show);
borderBottom(show);
}
void Cell::borderLeftRight(bool show)
{
borderLeft(show);
borderRight(show);
}
void Cell::borderAll(bool show)
{
borderTop(show);
borderBottom(show);
borderLeft(show);
borderRight(show);
}
void Cell::draw(Page& page, float x, float y, float width, float height)
{
// uncomment to force showing of the cell outline regardless of settings
//_outline = 15;
if (_outline != OUTLINE_NONE)
{
page.setLineWidth(_lineWidth);
page.moveTo(x, y);
if (_outline & OUTLINE_LEFT ) page.lineTo(x, y+height);
page.moveTo(x, y+height);
if (_outline & OUTLINE_TOP ) page.lineTo(x+width, y+height);
page.moveTo(x+width, y+height);
if (_outline & OUTLINE_RIGHT ) page.lineTo(x+width, y );
page.moveTo(x+width, y);
if (_outline & OUTLINE_BOTTOM) page.lineTo(x, y );
page.stroke();
}
std::string text = _content;
if (!text.empty())
{
Font originalFont = page.getFont();
float originalSize = page.getFontSize();
try
{
// font names hard coded here, needs more work on the library level
int fontStyle = _content.getAttribute(AttributedString::ATTR_STYLE);
float fontSize = _content.getAttribute(AttributedString::ATTR_SIZE);
if (fontStyle == AttributedString::STYLE_PLAIN)
{
if (!_pFontMap) page.setFont("Helvetica", fontSize);
else if (_trueType) page.setTTFont((*_pFontMap)[AttributedString::STYLE_PLAIN], fontSize, _encoding);
else page.setFont((*_pFontMap)[AttributedString::STYLE_PLAIN], fontSize, _encoding);
}
else if (fontStyle | AttributedString::STYLE_BOLD)
{
if (!_pFontMap) page.setFont("Helvetica-Bold", fontSize);
else if (_trueType) page.setTTFont((*_pFontMap)[AttributedString::STYLE_BOLD], fontSize, _encoding);
else page.setFont((*_pFontMap)[AttributedString::STYLE_BOLD], fontSize, _encoding);
}
else if (fontStyle | AttributedString::STYLE_ITALIC)
{
if (!_pFontMap) page.setFont("Helvetica-Oblique", fontSize);
else if (_trueType) page.setTTFont((*_pFontMap)[AttributedString::STYLE_ITALIC], fontSize, _encoding);
else page.setFont((*_pFontMap)[AttributedString::STYLE_ITALIC], fontSize, _encoding);
}
else if ((fontStyle & AttributedString::STYLE_BOLD) && (fontStyle & AttributedString::STYLE_ITALIC))
{
if (!_pFontMap) page.setFont("Helvetica-BoldOblique", fontSize);
else if (_trueType) page.setTTFont((*_pFontMap)[AttributedString::STYLE_BOLD | AttributedString::STYLE_ITALIC], fontSize, _encoding);
else page.setFont((*_pFontMap)[AttributedString::STYLE_BOLD | AttributedString::STYLE_ITALIC], fontSize, _encoding);
}
else
{
throw NotFoundException(format("Unknown font style: %d", fontStyle));
}
float tw = page.textWidth(text);
// trim text that does not fit
while (tw > width && text.size())
{
text = text.substr(0, text.size() - 1);
tw = page.textWidth(text);
}
float th = page.getFontSize();
float yPos = (height <= th) ? y : y + (height - th) / 2;
int align = _content.getAttribute(AttributedString::ATTR_ALIGN);
switch (align)
{
case AttributedString::ALIGN_LEFT:
page.writeOnce(x + 5, yPos, text); break;
case AttributedString::ALIGN_CENTER:
page.writeOnce(x + (width - tw) / 2, yPos, text); break;
break;
case AttributedString::ALIGN_RIGHT:
page.writeOnce(x + (width - tw), yPos, text); break;
break;
default:
throw NotFoundException(format("Unknown alignment mode: %d", align));
}
}
catch (Poco::Exception&)
{
page.setFont(originalFont, originalSize);
throw;
}
page.setFont(originalFont, originalSize);
}
}
} } // namespace Poco::PDF