#include FT_FREETYPE_H
#endif
-#ifndef QT_NO_PRINTER
-
QT_BEGIN_NAMESPACE
static const char * const agl =
return bindFont(tables);
}
-// ------------------ Type 1 generation ---------------------------
-
-// needs at least 6 bytes of space in tmp
-static const char *encodeNumber(int num, char *tmp)
-{
- const char *ret = tmp;
- if(num >= -107 && num <= 107) {
- QPdf::toHex((uchar)(num + 139), tmp);
- tmp += 2;
- } else if (num > 107 && num <= 1131) {
- num -= 108;
- QPdf::toHex((uchar)((num >> 8) + 247), tmp);
- tmp += 2;
- QPdf::toHex((uchar)(num & 0xff), tmp);
- tmp += 2;
- } else if(num < - 107 && num >= -1131) {
- num += 108;
- num = -num;
- QPdf::toHex((uchar)((num >> 8) + 251), tmp);
- tmp += 2;
- QPdf::toHex((uchar)(num & 0xff), tmp);
- tmp += 2;
- } else {
- *tmp++ = 'f';
- *tmp++ = 'f';
- QPdf::toHex((uchar)(num >> 24), tmp);
- tmp += 2;
- QPdf::toHex((uchar)(num >> 16), tmp);
- tmp += 2;
- QPdf::toHex((uchar)(num >> 8), tmp);
- tmp += 2;
- QPdf::toHex((uchar)(num >> 0), tmp);
- tmp += 2;
- }
- *tmp = 0;
-// qDebug("encodeNumber: %d -> '%s'", num, ret);
- return ret;
-}
-
-static QByteArray charString(const QPainterPath &path, qreal advance, qreal lsb, qreal ppem)
-{
- // the charstring commands we need
- const char *hsbw = "0D";
- const char *closepath = "09";
- const char *moveto[3] = { "16", "04", "15" };
- const char *lineto[3] = { "06", "07", "05" };
- const char *rcurveto = "08";
- const char *endchar = "0E";
-
- enum { horizontal = 1, vertical = 2 };
-
- char tmp[16];
-
- qreal factor = 1000./ppem;
-
- int lsb_i = qRound(lsb*factor);
- int advance_i = qRound(advance*factor);
-// qDebug("--- charstring");
-
- // first of all add lsb and width to the charstring using the hsbw command
- QByteArray charstring;
- charstring += encodeNumber(lsb_i, tmp);
- charstring += encodeNumber(advance_i, tmp);
- charstring += hsbw;
-
- // add the path
- int xl = lsb_i;
- int yl = 0;
- bool openpath = false;
- for (int i = 0; i < path.elementCount(); ++i) {
- const QPainterPath::Element &elm = path.elementAt(i);
- int x = qRound(elm.x*factor);
- int y = -qRound(elm.y*factor);
- int dx = x - xl;
- int dy = y - yl;
- if (elm.type == QPainterPath::MoveToElement && openpath) {
-// qDebug("closepath %s", closepath);
- charstring += closepath;
- }
- if (elm.type == QPainterPath::MoveToElement ||
- elm.type == QPainterPath::LineToElement) {
- int type = -1;
- if (dx || !dy) {
- charstring += encodeNumber(dx, tmp);
- type += horizontal;
-// qDebug("horizontal");
- }
- if (dy) {
- charstring += encodeNumber(dy, tmp);
- type += vertical;
-// qDebug("vertical");
- }
-// qDebug("moveto/lineto %s", (elm.type == QPainterPath::MoveToElement ? moveto[type] : lineto[type]));
- charstring += (elm.type == QPainterPath::MoveToElement ? moveto[type] : lineto[type]);
- openpath = true;
- xl = x;
- yl = y;
- } else {
- Q_ASSERT(elm.type == QPainterPath::CurveToElement);
- const QPainterPath::Element &elm2 = path.elementAt(++i);
- const QPainterPath::Element &elm3 = path.elementAt(++i);
- int x2 = qRound(elm2.x*factor);
- int y2 = -qRound(elm2.y*factor);
- int x3 = qRound(elm3.x*factor);
- int y3 = -qRound(elm3.y*factor);
- charstring += encodeNumber(dx, tmp);
- charstring += encodeNumber(dy, tmp);
- charstring += encodeNumber(x2 - x, tmp);
- charstring += encodeNumber(y2 - y, tmp);
- charstring += encodeNumber(x3 - x2, tmp);
- charstring += encodeNumber(y3 - y2, tmp);
- charstring += rcurveto;
- openpath = true;
- xl = x3;
- yl = y3;
-// qDebug("rcurveto");
- }
- }
- if (openpath)
- charstring += closepath;
- charstring += endchar;
- if (charstring.length() > 240) {
- int pos = 240;
- while (pos < charstring.length()) {
- charstring.insert(pos, '\n');
- pos += 241;
- }
- }
- return charstring;
-}
-
-#ifndef QT_NO_FREETYPE
-static const char *helvetica_styles[4] = {
- "Helvetica",
- "Helvetica-Bold",
- "Helvetica-Oblique",
- "Helvetica-BoldOblique"
-};
-static const char *times_styles[4] = {
- "Times-Regular",
- "Times-Bold",
- "Times-Italic",
- "Times-BoldItalic"
-};
-static const char *courier_styles[4] = {
- "Courier",
- "Courier-Bold",
- "Courier-Oblique",
- "Courier-BoldOblique"
-};
-#endif
-
-QByteArray QFontSubset::toType1() const
-{
- QFontEngine::Properties properties = fontEngine->properties();
- QVector<int> reverseMap = getReverseMap();
-
- QByteArray font;
- QPdf::ByteStream s(&font);
-
- QByteArray id = QByteArray::number(object_id);
- QByteArray psname = properties.postscriptName;
- psname.replace(' ', "");
-
- standard_font = false;
-
-#ifndef QT_NO_FREETYPE
- FT_Face face = ft_face(fontEngine);
- if (face && !FT_IS_SCALABLE(face)) {
- int style = 0;
- if (fontEngine->fontDef.style)
- style += 2;
- if (fontEngine->fontDef.weight >= QFont::Bold)
- style++;
- if (fontEngine->fontDef.family.contains(QLatin1String("Helvetica"))) {
- psname = helvetica_styles[style];
- standard_font = true;
- } else if (fontEngine->fontDef.family.contains(QLatin1String("Times"))) {
- psname = times_styles[style];
- standard_font = true;
- } else if (fontEngine->fontDef.family.contains(QLatin1String("Courier"))) {
- psname = courier_styles[style];
- standard_font = true;
- }
- }
-#endif
- s << "/F" << id << "-Base\n";
- if (standard_font) {
- s << '/' << psname << " findfont\n"
- "0 dict copy dup /NumGlyphs 0 put dup /CMap 256 array put def\n";
- } else {
- s << "<<\n";
- if(!psname.isEmpty())
- s << "/FontName /" << psname << '\n';
- s << "/FontInfo <</FsType " << (int)fontEngine->fsType << ">>\n"
- "/FontType 1\n"
- "/PaintType 0\n"
- "/FontMatrix [.001 0 0 .001 0 0]\n"
- "/FontBBox { 0 0 0 0 }\n"
- "/Private <<\n"
- "/password 5839\n"
- "/MinFeature {16 16}\n"
- "/BlueValues []\n"
- "/lenIV -1\n"
- ">>\n"
- "/CharStrings << >>\n"
- "/NumGlyphs 0\n"
- "/CMap 256 array\n"
- ">> def\n";
- }
- s << type1AddedGlyphs();
- downloaded_glyphs = glyph_indices.size();
-
- return font;
-}
-
-QByteArray QFontSubset::type1AddedGlyphs() const
-{
- if (downloaded_glyphs == glyph_indices.size())
- return QByteArray();
-
- QFontEngine::Properties properties = fontEngine->properties();
- QVector<int> reverseMap = getReverseMap();
- QByteArray glyphs;
- QPdf::ByteStream s(&glyphs);
-
- int nGlyphs = glyph_indices.size();
- QByteArray id = QByteArray::number(object_id);
-
- s << 'F' << id << "-Base [\n";
- for (int i = downloaded_glyphs; i < nGlyphs; ++i) {
- glyph_t g = glyph_indices.at(i);
- QPainterPath path;
- glyph_metrics_t metric;
- fontEngine->getUnscaledGlyph(g, &path, &metric);
- QByteArray charstring = charString(path, metric.xoff.toReal(), metric.x.toReal(),
- properties.emSquare.toReal());
- s << glyphName(i, reverseMap);
- if (!standard_font)
- s << "\n<" << charstring << ">\n";
- }
- s << (standard_font ? "] T1AddMapping\n" : "] T1AddGlyphs\n");
- return glyphs;
-}
-
QT_END_NAMESPACE
-
-#endif // QT_NO_PRINTER