[poppler] poppler/Annot.cc poppler/Annot.h poppler/Gfx.h
Albert Astals Cid
aacid at kemper.freedesktop.org
Sun Jan 4 07:56:20 PST 2009
poppler/Annot.cc | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
poppler/Annot.h | 2 ++
poppler/Gfx.h | 7 ++++---
3 files changed, 53 insertions(+), 5 deletions(-)
New commits:
commit 0963c276ba972a36c2895e4fe1c7475acd489738
Author: Albert Astals Cid <aacid at kde.org>
Date: Sun Jan 4 16:54:32 2009 +0100
Fix some checked checkboxes not rendering correctly
If we are forcing ZaDb/ZapfDingbats to correctly draw a checkmark in the checkbox, but the file does not have such font defined we need to create a fake one so the system really renders it
Fixes bug 19359
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 7c01d7b..3cc13a0 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -2140,6 +2140,7 @@ void AnnotWidget::drawText(GooString *text, GooString *da, GfxFontDict *fontDict
double fontSize, fontSize2, borderWidth, x, xPrev, y, w, wMax;
int tfPos, tmPos, i, j;
GBool freeText = gFalse; // true if text should be freed before return
+ GBool freeFont = gFalse;
//~ if there is no MK entry, this should use the existing content stream,
//~ and only replace the marked content portion of it
@@ -2174,7 +2175,6 @@ void AnnotWidget::drawText(GooString *text, GooString *da, GfxFontDict *fontDict
}
// force ZapfDingbats
- //~ this should create the font if needed (?)
if (forceZapfDingbats) {
if (tfPos >= 0) {
tok = (GooString *)daToks->get(tfPos);
@@ -2191,7 +2191,20 @@ void AnnotWidget::drawText(GooString *text, GooString *da, GfxFontDict *fontDict
tok = (GooString *)daToks->get(tfPos);
if (tok->getLength() >= 1 && tok->getChar(0) == '/') {
if (!fontDict || !(font = fontDict->lookup(tok->getCString() + 1))) {
- error(-1, "Unknown font in field's DA string");
+ if (forceZapfDingbats) {
+ // We are forcing ZaDb but the font does not exist
+ // so create a fake one
+ Ref r; // dummy Ref, it's not used at all in this codepath
+ r.num = 0;
+ r.gen = 0;
+ Dict *d = new Dict(xref);
+ font = new Gfx8BitFont(xref, "ZaDb", r, new GooString("ZapfDingbats"), fontType1, d);
+ delete d;
+ freeFont = gTrue;
+ addDingbatsResource = gTrue;
+ } else {
+ error(-1, "Unknown font in field's DA string");
+ }
}
} else {
error(-1, "Invalid font name in 'Tf' operator in field's DA string");
@@ -2496,6 +2509,9 @@ void AnnotWidget::drawText(GooString *text, GooString *da, GfxFontDict *fontDict
delete text;
}
delete convertedText;
+ if (freeFont) {
+ font->decRefCnt();
+ }
}
// Draw the variable text or caption for a field.
@@ -3102,12 +3118,41 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) {
return;
}
+ addDingbatsResource = gFalse;
generateFieldAppearance ();
// draw the appearance stream
appearance.fetch(xref, &obj);
+ if (addDingbatsResource) {
+ // We are forcing ZaDb but the font does not exist
+ // so create a fake one
+ Object baseFontObj, subtypeObj;
+ baseFontObj.initName("ZapfDingbats");
+ subtypeObj.initName("Type1");
+
+ Object fontDictObj;
+ Dict *fontDict = new Dict(xref);
+ fontDict->decRef();
+ fontDict->add(copyString("BaseFont"), &baseFontObj);
+ fontDict->add(copyString("Subtype"), &subtypeObj);
+ fontDictObj.initDict(fontDict);
+
+ Object fontsDictObj;
+ Dict *fontsDict = new Dict(xref);
+ fontsDict->decRef();
+ fontsDict->add(copyString("ZaDb"), &fontDictObj);
+ fontsDictObj.initDict(fontsDict);
+
+ Dict *dict = new Dict(xref);
+ dict->add(copyString("Font"), &fontsDictObj);
+ gfx->pushResources(dict);
+ delete dict;
+ }
gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
rect->x1, rect->y1, rect->x2, rect->y2);
+ if (addDingbatsResource) {
+ gfx->popResources();
+ }
obj.free();
}
diff --git a/poppler/Annot.h b/poppler/Annot.h
index 6dd7850..0b8ad2a 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -21,6 +21,7 @@
// Copyright (C) 2008 Hugo Mercier <hmercier31 at gmail.com>
// Copyright (C) 2008 Pino Toscano <pino at kde.org>
// Copyright (C) 2008 Tomas Are Haavet <tomasare at gmail.com>
+// Copyright (C) 2009 Albert Astals Cid <aacid at kde.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -1194,6 +1195,7 @@ private:
// AnnotBorderBS border; // BS
Dict *parent; // Parent
GBool regen;
+ GBool addDingbatsResource;
};
//------------------------------------------------------------------------
diff --git a/poppler/Gfx.h b/poppler/Gfx.h
index 6787738..a75a92a 100644
--- a/poppler/Gfx.h
+++ b/poppler/Gfx.h
@@ -17,6 +17,7 @@
// Copyright (C) 2007 Iñigo MartÃnez <inigomartinez at gmail.com>
// Copyright (C) 2008 Brad Hards <bradh at kde.org>
// Copyright (C) 2008 Carlos Garcia Campos <carlosgc at gnome.org>
+// Copyright (C) 2009 Albert Astals Cid <aacid at kde.org>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
@@ -163,6 +164,9 @@ public:
// Get the current graphics state object.
GfxState *getState() { return state; }
+ void pushResources(Dict *resDict);
+ void popResources();
+
private:
XRef *xref; // the xref table for this PDF file
@@ -333,9 +337,6 @@ private:
GBool contentIsHidden();
void pushMarkedContent();
void popMarkedContent();
-
- void pushResources(Dict *resDict);
- void popResources();
};
#endif
More information about the poppler
mailing list