master moved from d0cb1071b288 to 242b14ae7f38
3 new revisions:
Revision: f927728169cd
Author: Ray Smith <
ra...@google.com>
Date: Thu Oct 9 20:28:03 2014 UTC
Log: Fixed issue 1207
https://code.google.com/p/tesseract-ocr/source/detail?r=f927728169cd
Revision: d9699c409921
Author: Ray Smith <
ra...@google.com>
Date: Thu Oct 9 20:29:01 2014 UTC
Log: Fixed bidi handling in PDF output
https://code.google.com/p/tesseract-ocr/source/detail?r=d9699c409921
Revision: 242b14ae7f38
Author: Ray Smith <
ra...@google.com>
Date: Thu Oct 9 20:29:46 2014 UTC
Log: Reduced size of multi-renderer implementation from code review
https://code.google.com/p/tesseract-ocr/source/detail?r=242b14ae7f38
==============================================================================
Revision: f927728169cd
Author: Ray Smith <
ra...@google.com>
Date: Thu Oct 9 20:28:03 2014 UTC
Log: Fixed issue 1207
https://code.google.com/p/tesseract-ocr/source/detail?r=f927728169cd
Modified:
/ccmain/tesseractclass.cpp
/ccmain/tesseractclass.h
/ccutil/unicharset.cpp
/ccutil/unicharset.h
=======================================
--- /ccmain/tesseractclass.cpp Tue Oct 7 21:37:34 2014 UTC
+++ /ccmain/tesseractclass.cpp Thu Oct 9 20:28:03 2014 UTC
@@ -1,7 +1,23 @@
///////////////////////////////////////////////////////////////////////
// File: tesseractclass.cpp
-// Description: An instance of Tesseract. For thread safety, *every*
-// global variable goes in here, directly, or indirectly.
+// Description: The Tesseract class. It holds/owns everything needed
+// to run Tesseract on a single language, and also a set of
+// sub-Tesseracts to run sub-languages. For thread safety,
*every*
+// variable that was previously global or static (except for
+// constant data, and some visual debugging flags) has been
moved
+// in here, directly, or indirectly.
+// This makes it safe to run multiple Tesseracts in different
+// threads in parallel, and keeps the different language
+// instances separate.
+// Some global functions remain, but they are isolated
re-entrant
+// functions that operate on their arguments. Functions that
work
+// on variable data have been moved to an appropriate class
based
+// mostly on the directory hierarchy. For more information see
+// slide 6 of "2ArchitectureAndDataStructures" in
+//
https://drive.google.com/file/d/0B7l10Bj_LprhbUlIUFlCdGtDYkE/edit?usp=sharing
+// Some global data and related functions still exist in the
+// training-related code, but they don't interfere with normal
+// recognition operation.
// Author: Ray Smith
// Created: Fri Mar 07 08:17:01 PST 2008
//
@@ -65,6 +81,9 @@
"Blacklist of chars not to recognize", this->params()),
STRING_MEMBER(tessedit_char_whitelist, "",
"Whitelist of chars to recognize", this->params()),
+ STRING_MEMBER(tessedit_char_unblacklist, "",
+ "List of chars to override tessedit_char_blacklist",
+ this->params()),
BOOL_MEMBER(tessedit_ambigs_training, false,
"Perform training for ambiguities", this->params()),
INT_MEMBER(pageseg_devanagari_split_strategy,
@@ -578,11 +597,13 @@
void Tesseract::SetBlackAndWhitelist() {
// Set the white and blacklists (if any)
unicharset.set_black_and_whitelist(tessedit_char_blacklist.string(),
- tessedit_char_whitelist.string());
+ tessedit_char_whitelist.string(),
+ tessedit_char_unblacklist.string());
// Black and white lists should apply to all loaded classifiers.
for (int i = 0; i < sub_langs_.size(); ++i) {
sub_langs_[i]->unicharset.set_black_and_whitelist(
- tessedit_char_blacklist.string(),
tessedit_char_whitelist.string());
+ tessedit_char_blacklist.string(), tessedit_char_whitelist.string(),
+ tessedit_char_unblacklist.string());
}
}
=======================================
--- /ccmain/tesseractclass.h Tue Oct 7 21:37:34 2014 UTC
+++ /ccmain/tesseractclass.h Thu Oct 9 20:28:03 2014 UTC
@@ -1,7 +1,12 @@
///////////////////////////////////////////////////////////////////////
// File: tesseractclass.h
-// Description: An instance of Tesseract. For thread safety, *every*
+// Description: The Tesseract class. It holds/owns everything needed
+// to run Tesseract on a single language, and also a set of
+// sub-Tesseracts to run sub-languages. For thread safety,
*every*
// global variable goes in here, directly, or indirectly.
+// This makes it safe to run multiple Tesseracts in different
+// threads in parallel, and keeps the different language
+// instances separate.
// Author: Ray Smith
// Created: Fri Mar 07 08:17:01 PST 2008
//
@@ -743,6 +748,8 @@
"Blacklist of chars not to recognize");
STRING_VAR_H(tessedit_char_whitelist, "",
"Whitelist of chars to recognize");
+ STRING_VAR_H(tessedit_char_unblacklist, "",
+ "List of chars to override tessedit_char_blacklist");
BOOL_VAR_H(tessedit_ambigs_training, false,
"Perform training for ambiguities");
INT_VAR_H(pageseg_devanagari_split_strategy,
=======================================
--- /ccutil/unicharset.cpp Thu Sep 18 01:29:32 2014 UTC
+++ /ccutil/unicharset.cpp Thu Oct 9 20:28:03 2014 UTC
@@ -985,8 +985,10 @@
// Set a whitelist and/or blacklist of characters to recognize.
// An empty or NULL whitelist enables everything (minus any blacklist).
// An empty or NULL blacklist disables nothing.
+// An empty or NULL blacklist has no effect.
void UNICHARSET::set_black_and_whitelist(const char* blacklist,
- const char* whitelist) {
+ const char* whitelist,
+ const char* unblacklist) {
bool def_enabled = whitelist == NULL || whitelist[0] == '\0';
// Set everything to default
for (int ch = 0; ch < size_used; ++ch)
@@ -1009,6 +1011,15 @@
unichars[encoding[i]].properties.enabled = false;
}
}
+ if (unblacklist != NULL && unblacklist[0] != '\0') {
+ // Re-enable the unblacklist.
+ GenericVector<UNICHAR_ID> encoding;
+ encode_string(unblacklist, false, &encoding, NULL, NULL);
+ for (int i = 0; i < encoding.size(); ++i) {
+ if (encoding[i] != INVALID_UNICHAR_ID)
+ unichars[encoding[i]].properties.enabled = true;
+ }
+ }
}
int UNICHARSET::add_script(const char* script) {
=======================================
--- /ccutil/unicharset.h Mon Aug 11 23:23:06 2014 UTC
+++ /ccutil/unicharset.h Thu Oct 9 20:28:03 2014 UTC
@@ -381,11 +381,14 @@
// Set a whitelist and/or blacklist of characters to recognize.
// An empty or NULL whitelist enables everything (minus any blacklist).
// An empty or NULL blacklist disables nothing.
+ // An empty or NULL unblacklist has no effect.
// The blacklist overrides the whitelist.
+ // The unblacklist overrides the blacklist.
// Each list is a string of utf8 character strings. Boundaries between
// unicharset units are worked out automatically, and characters not in
// the unicharset are silently ignored.
- void set_black_and_whitelist(const char* blacklist, const char*
whitelist);
+ void set_black_and_whitelist(const char* blacklist, const char*
whitelist,
+ const char* unblacklist);
// Set the isalpha property of the given unichar to the given value.
void set_isalpha(UNICHAR_ID unichar_id, bool value) {
==============================================================================
Revision: d9699c409921
Author: Ray Smith <
ra...@google.com>
Date: Thu Oct 9 20:29:01 2014 UTC
Log: Fixed bidi handling in PDF output
https://code.google.com/p/tesseract-ocr/source/detail?r=d9699c409921
Modified:
/api/pdfrenderer.cpp
/api/renderer.h
/tessdata/pdf.ttf
/tessdata/pdf.ttx
=======================================
--- /api/pdfrenderer.cpp Tue Oct 7 21:37:34 2014 UTC
+++ /api/pdfrenderer.cpp Thu Oct 9 20:29:01 2014 UTC
@@ -59,16 +59,119 @@
long dist2(int x1, int y1, int x2, int y2) {
return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
}
+
+// Viewers like evince can get really confused during copy-paste when
+// the baseline wanders around. So I've decided to project every word
+// onto the (straight) line baseline. All numbers are in the native
+// PDF coordinate system, which has the origin in the bottom left and
+// the unit is points, which is 1/72 inch. Tesseract reports baselines
+// left-to-right no matter what the reading order is. We need the
+// word baseline in reading order, so we do that conversion here. Returns
+// the word's baseline origin and length.
+void GetWordBaseline(int writing_direction, int ppi, int height,
+ int word_x1, int word_y1, int word_x2, int word_y2,
+ int line_x1, int line_y1, int line_x2, int line_y2,
+ double *x0, double *y0, double *length) {
+ if (writing_direction == WRITING_DIRECTION_RIGHT_TO_LEFT) {
+ Swap(&word_x1, &word_x2);
+ Swap(&word_y1, &word_y2);
+ }
+ double word_length;
+ double x, y;
+ {
+ int px = word_x1;
+ int py = word_y1;
+ double l2 = dist2(line_x1, line_y1, line_x2, line_y2);
+ if (l2 == 0) {
+ x = line_x1;
+ y = line_y1;
+ } else {
+ double t = ((px - line_x2) * (line_x2 - line_x1) +
+ (py - line_y2) * (line_y2 - line_y1)) / l2;
+ x = line_x2 + t * (line_x2 - line_x1);
+ y = line_y2 + t * (line_y2 - line_y1);
+ }
+ word_length = sqrt(static_cast<double>(dist2(word_x1, word_y1,
+ word_x2, word_y2)));
+ word_length = word_length * 72.0 / ppi;
+ x = x * 72 / ppi;
+ y = height - (y * 72.0 / ppi);
+ }
+ *x0 = x;
+ *y0 = y;
+ *length = word_length;
+}
+
+// Compute coefficients for an affine matrix describing the rotation
+// of the text. If the text is right-to-left such as Arabic or Hebrew,
+// we reflect over the Y-axis. This matrix will set the coordinate
+// system for placing text in the PDF file.
+//
+// RTL
+// [ x' ] = [ a b ][ x ] = [-1 0 ] [ cos sin ][ x ]
+// [ y' ] [ c d ][ y ] [ 0 1 ] [-sin cos ][ y ]
+void AffineMatrix(int writing_direction,
+ int line_x1, int line_y1, int line_x2, int line_y2,
+ double *a, double *b, double *c, double *d) {
+ double theta = atan2(static_cast<double>(line_y1 - line_y2),
+ static_cast<double>(line_x2 - line_x1));
+ *a = cos(theta);
+ *b = sin(theta);
+ *c = -sin(theta);
+ *d = cos(theta);
+ switch(writing_direction) {
+ case WRITING_DIRECTION_RIGHT_TO_LEFT:
+ *a = -*a;
+ *b = -*b;
+ break;
+ case WRITING_DIRECTION_TOP_TO_BOTTOM:
+ // TODO(jbreiden) Consider using the vertical PDF writing mode.
+ break;
+ default:
+ break;
+ }
+}
+
+// There are some really stupid PDF viewers in the wild, such as
+// 'Preview' which ships with the Mac. They do a better job with text
+// selection and highlighting when given perfectly flat baseline
+// instead of very slightly tilted. We clip small tilts to appease
+// these viewers. I chose this threshold large enough to absorb noise,
+// but small enough that lines probably won't cross each other if the
+// whole page is tilted at almost exactly the clipping threshold.
+void ClipBaseline(int ppi, int x1, int y1, int x2, int y2,
+ int *line_x1, int *line_y1,
+ int *line_x2, int *line_y2) {
+ *line_x1 = x1;
+ *line_y1 = y1;
+ *line_x2 = x2;
+ *line_y2 = y2;
+ double rise = abs(y2 - y1) * 72 / ppi;
+ double run = abs(x2 - x1) * 72 / ppi;
+ if (rise < 2.0 && 2.0 < run)
+ *line_y1 = *line_y2 = (y1 + y2) / 2;
+}
char* TessPDFRenderer::GetPDFTextObjects(TessBaseAPI* api,
double width, double height) {
- double ppi = api->GetSourceYResolution();
STRING pdf_str("");
+ double ppi = api->GetSourceYResolution();
+
+ // These initial conditions are all arbitrary and will be overwritten
double old_x = 0.0, old_y = 0.0;
- int old_pointsize = 0;
+ int old_fontsize = 0;
+ tesseract::WritingDirection old_writing_direction =
+ WRITING_DIRECTION_LEFT_TO_RIGHT;
+ bool new_block = true;
+ int fontsize = 0;
+ double a = 1;
+ double b = 0;
+ double c = 0;
+ double d = 1;
- // TODO(jbreiden) Slightly cleaner from an abstraction standpoint
- // if this were to live inside a separate text object.
+ // TODO(jbreiden) This marries the text and image together.
+ // Slightly cleaner from an abstraction standpoint if this were to
+ // live inside a separate text object.
pdf_str += "q ";
pdf_str.add_str_double("", prec(width));
pdf_str += " 0 0 ";
@@ -76,28 +179,18 @@
pdf_str += " 0 0 cm /Im1 Do Q\n";
ResultIterator *res_it = api->GetIterator();
-
while (!res_it->Empty(RIL_BLOCK)) {
if (res_it->IsAtBeginningOf(RIL_BLOCK)) {
- pdf_str += "BT\n3 Tr\n"; // Begin text object, use invisible ink
- old_pointsize = 0.0; // Every block will declare its font
+ pdf_str += "BT\n3 Tr"; // Begin text object, use invisible ink
+ old_fontsize = 0; // Every block will declare its fontsize
+ new_block = true; // Every block will declare its affine
matrix
}
int line_x1, line_y1, line_x2, line_y2;
if (res_it->IsAtBeginningOf(RIL_TEXTLINE)) {
- res_it->Baseline(RIL_TEXTLINE,
- &line_x1, &line_y1, &line_x2, &line_y2);
- double rise = abs(line_y2 - line_y1) * 72 / ppi;
- double run = abs(line_x2 - line_x1) * 72 / ppi;
- // There are some really stupid PDF viewers in the wild, such as
- // 'Preview' which ships with the Mac. They might do a better
- // job with text selection and highlighting when given perfectly
- // straight text instead of very slightly tilted text. I chose
- // this threshold large enough to absorb noise, but small enough
- // that lines probably won't cross each other if the whole page
- // is tilted at almost exactly the clipping threshold.
- if (rise < 2.0 && 2.0 < run)
- line_y1 = line_y2 = (line_y1 + line_y2) / 2;
+ int x1, y1, x2, y2;
+ res_it->Baseline(RIL_TEXTLINE, &x1, &y1, &x2, &y2);
+ ClipBaseline(ppi, x1, y1, x2, y2, &line_x1, &line_y1, &line_x2,
&line_y2);
}
if (res_it->Empty(RIL_WORD)) {
@@ -105,120 +198,78 @@
continue;
}
- int word_x1, word_y1, word_x2, word_y2;
- res_it->Baseline(RIL_WORD, &word_x1, &word_y1, &word_x2, &word_y2);
-
- // The critical one is writing_direction
- tesseract::Orientation orientation;
+ // Writing direction changes at a per-word granularity
tesseract::WritingDirection writing_direction;
- tesseract::TextlineOrder textline_order;
- float deskew_angle;
- res_it->Orientation(&orientation, &writing_direction,
- &textline_order, &deskew_angle);
-
- // Unlike Tesseract, we always want the word baseline in reading order.
- if (writing_direction == WRITING_DIRECTION_RIGHT_TO_LEFT) {
- Swap(&word_x1, &word_x2);
- Swap(&word_y1, &word_y2);
+ {
+ tesseract::Orientation orientation;
+ tesseract::TextlineOrder textline_order;
+ float deskew_angle;
+ res_it->Orientation(&orientation, &writing_direction,
+ &textline_order, &deskew_angle);
+ if (writing_direction != WRITING_DIRECTION_TOP_TO_BOTTOM) {
+ switch (res_it->WordDirection()) {
+ case DIR_LEFT_TO_RIGHT:
+ writing_direction = WRITING_DIRECTION_LEFT_TO_RIGHT;
+ break;
+ case DIR_RIGHT_TO_LEFT:
+ writing_direction = WRITING_DIRECTION_RIGHT_TO_LEFT;
+ break;
+ default:
+ writing_direction = old_writing_direction;
+ }
+ }
}
- // Viewers like evince can get really confused during copy-paste
- // when the baseline wanders around. I've decided to force every
- // word to match the (straight) baseline. The math below is just
- // projecting the word origin onto the baseline. All numbers are
- // in the native PDF coordinate system, which has the origin in
- // the bottom left and the unit is points, which is 1/72 inch.
- double word_length;
- double x, y;
+ // Where is word origin and how long is it?
+ double x, y, word_length;
{
- int px = word_x1;
- int py = word_y1;
- double l2 = dist2(line_x1, line_y1, line_x2, line_y2);
- if (l2 == 0) {
- x = line_x1;
- y = line_y1;
- } else {
- double t = ((px - line_x2) * (line_x2 - line_x1) +
- (py - line_y2) * (line_y2 - line_y1)) / l2;
- x = line_x2 + t * (line_x2 - line_x1);
- y = line_y2 + t * (line_y2 - line_y1);
- }
- word_length = sqrt(static_cast<double>(dist2(word_x1, word_y1,
- word_x2, word_y2)));
- word_length = word_length * 72.0 / ppi;
- x = x * 72 / ppi;
- y = height - (y * 72.0 / ppi);
+ int word_x1, word_y1, word_x2, word_y2;
+ res_it->Baseline(RIL_WORD, &word_x1, &word_y1, &word_x2, &word_y2);
+ GetWordBaseline(writing_direction, ppi, height,
+ word_x1, word_y1, word_x2, word_y2,
+ line_x1, line_y1, line_x2, line_y2,
+ &x, &y, &word_length);
}
- int pointsize = 0;
- if (res_it->IsAtBeginningOf(RIL_TEXTLINE)) {
- // Calculate the rotation angle in the PDF cooordinate system,
- // which has the origin in the bottom left. The Tesseract
- // coordinate system has the origin in the upper left.
- //
- // PDF is kind of a like turtle graphics, and we orient the
- // turtle (errr... initial cursor position) with an affine
- // transformation.
- //
- // Rotate RTL
Translate
- //
- // [ x' y' 1 ] = [ x y 1 ] [ cos𝜃 -sin𝜃 0 ] [ -1 0 0 ] [ 1 0 0 ]
- // [ sin𝜃 cos𝜃 0 ] [ 0 1 0 ] [ 0 1 0 ]
- // [ 0 0 1 ] [ 0 0 1 ] [ x y 1 ]
- //
- double theta = atan2(static_cast<double>(line_y1 - line_y2),
- static_cast<double>(line_x2 - line_x1));
- double a, b, c, d;
- a = cos(theta);
- b = sin(theta);
- c = -sin(theta);
- d = cos(theta);
- switch(writing_direction) {
- case WRITING_DIRECTION_RIGHT_TO_LEFT:
- a = -a;
- b = -b;
- c = -c;
- break;
- case WRITING_DIRECTION_TOP_TO_BOTTOM:
- // TODO(jbreiden) Consider switching PDF writing mode to
vertical.
- break;
- default:
- break;
- }
-
- pdf_str.add_str_double("", prec(a)); // . This affine matrix
+ if (writing_direction != old_writing_direction || new_block) {
+ AffineMatrix(writing_direction,
+ line_x1, line_y1, line_x2, line_y2, &a, &b, &c, &d);
+ pdf_str.add_str_double(" ", prec(a)); // . This affine matrix
pdf_str.add_str_double(" ", prec(b)); // . sets the coordinate
pdf_str.add_str_double(" ", prec(c)); // . system for all
- pdf_str.add_str_double(" ", prec(d)); // . text in the entire
- pdf_str.add_str_double(" ", prec(x)); // . line.
+ pdf_str.add_str_double(" ", prec(d)); // . text that follows.
+ pdf_str.add_str_double(" ", prec(x)); // .
pdf_str.add_str_double(" ", prec(y)); // .
pdf_str += (" Tm "); // Place cursor absolutely
+ new_block = false;
} else {
- double offset = sqrt(static_cast<double>(dist2(old_x, old_y, x, y)));
- pdf_str.add_str_double(" ", prec(offset)); // Delta x in pts
- pdf_str.add_str_double(" ", 0); // Delta y in pts
- pdf_str += (" Td "); // Relative moveto
+ double dx = x - old_x;
+ double dy = y - old_y;
+ pdf_str.add_str_double(" ", prec(dx * a + dy * b));
+ pdf_str.add_str_double(" ", prec(dx * c + dy * d));
+ pdf_str += (" Td "); // Relative moveto
}
old_x = x;
old_y = y;
+ old_writing_direction = writing_direction;
// Adjust font size on a per word granularity. Pay attention to
- // pointsize, old_pointsize, and pdf_str. We've found that for
- // in Arabic, Tesseract will happily return a pointsize of zero,
+ // fontsize, old_fontsize, and pdf_str. We've found that for
+ // in Arabic, Tesseract will happily return a fontsize of zero,
// so we make up a default number to protect ourselves.
{
bool bold, italic, underlined, monospace, serif, smallcaps;
int font_id;
res_it->WordFontAttributes(&bold, &italic, &underlined, &monospace,
- &serif, &smallcaps, &pointsize, &font_id);
- const int kDefaultPointSize = 8;
- if (pointsize <= 0)
- pointsize = kDefaultPointSize;
- if (pointsize != old_pointsize) {
+ &serif, &smallcaps, &fontsize, &font_id);
+ const int kDefaultFontsize = 8;
+ if (fontsize <= 0)
+ fontsize = kDefaultFontsize;
+ if (fontsize != old_fontsize) {
char textfont[20];
- snprintf(textfont, sizeof(textfont), "/f-0-0 %d Tf ", pointsize);
+ snprintf(textfont, sizeof(textfont), "/f-0-0 %d Tf ", fontsize);
pdf_str += textfont;
- old_pointsize = pointsize;
+ old_fontsize = fontsize;
}
}
@@ -243,9 +294,9 @@
delete []grapheme;
res_it->Next(RIL_SYMBOL);
} while (!res_it->Empty(RIL_BLOCK)
&& !res_it->IsAtBeginningOf(RIL_WORD));
- if (word_length > 0 && pdf_word_len > 0 && pointsize > 0) {
+ if (word_length > 0 && pdf_word_len > 0 && fontsize > 0) {
double h_stretch =
- kCharWidth * prec(100.0 * word_length / (pointsize *
pdf_word_len));
+ kCharWidth * prec(100.0 * word_length / (fontsize *
pdf_word_len));
pdf_str.add_str_double("", h_stretch);
pdf_str += " Tz"; // horizontal stretch
pdf_str += " [ ";
@@ -449,7 +500,7 @@
L_COMP_DATA *cid = NULL;
const int kJpegQuality = 85;
- l_generateCIDataForPdf(filename, pix, kJpegQuality, &cid);
+
// TODO(jbreiden) Leptonica 1.71 doesn't correctly handle certain
// types of PNG files, especially if there are 2 samples per pixel.
// We can get rid of this logic after Leptonica 1.72 is released and
@@ -747,5 +798,4 @@
AppendString(buf);
return true;
}
-
} // namespace tesseract
=======================================
--- /api/renderer.h Tue Oct 7 21:37:34 2014 UTC
+++ /api/renderer.h Thu Oct 9 20:29:01 2014 UTC
@@ -195,7 +195,7 @@
double width, double height);
// Turn an image into a PDF object. Only transcode if we have to.
static bool imageToPDFObj(Pix *pix, char *filename, long int objnum,
- char **pdf_object, long int *pdf_object_size);
+ char **pdf_object, long int *pdf_object_size);
};
=======================================
--- /tessdata/pdf.ttf Thu Jan 9 19:14:11 2014 UTC
+++ /tessdata/pdf.ttf Thu Oct 9 20:29:01 2014 UTC
Binary file, no diff available.
=======================================
--- /tessdata/pdf.ttx Thu Jan 9 19:14:11 2014 UTC
+++ /tessdata/pdf.ttx Thu Oct 9 20:29:01 2014 UTC
@@ -120,38 +120,49 @@
<GlyphID id="114" name="glyph00114"/>
<GlyphID id="115" name="glyph00115"/>
<GlyphID id="116" name="glyph00116"/>
+ <GlyphID id="117" name="glyph00117"/>
+ <GlyphID id="118" name="glyph00118"/>
+ <GlyphID id="119" name="glyph00119"/>
+ <GlyphID id="120" name="glyph00120"/>
+ <GlyphID id="121" name="glyph00121"/>
+ <GlyphID id="122" name="glyph00122"/>
+ <GlyphID id="123" name="glyph00123"/>
+ <GlyphID id="124" name="glyph00124"/>
+ <GlyphID id="125" name="glyph00125"/>
+ <GlyphID id="126" name="glyph00126"/>
+ <GlyphID id="127" name="glyph00127"/>
</GlyphOrder>
<head>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="1.0"/>
- <fontRevision value="2.31999206543"/>
- <checkSumAdjustment value="0xd4fdc458"/>
+ <fontRevision value="2.32001"/>
+ <checkSumAdjustment value="0xd879ce2c"/>
<magicNumber value="0x5f0f3cf5"/>
<flags value="00000000 00011111"/>
<unitsPerEm value="2048"/>
<created value="Fri Sep 10 06:45:17 2010"/>
- <modified value="Fri Sep 10 06:45:17 2010"/>
+ <modified value="Thu May 15 23:21:18 2014"/>
<xMin value="0"/>
<yMin value="0"/>
- <xMax value="1000"/>
- <yMax value="1000"/>
+ <xMax value="2000"/>
+ <yMax value="2000"/>
<macStyle value="00000000 00000000"/>
<lowestRecPPEM value="8"/>
<fontDirectionHint value="0"/>
- <indexToLocFormat value="1"/>
+ <indexToLocFormat value="0"/>
<glyphDataFormat value="0"/>
</head>
<hhea>
<tableVersion value="1.0"/>
- <ascent value="1000"/>
+ <ascent value="2000"/>
<descent value="0"/>
<lineGap value="0"/>
- <advanceWidthMax value="3554"/>
- <minLeftSideBearing value="-2090"/>
- <minRightSideBearing value="-1455"/>
- <xMaxExtent value="3442"/>
+ <advanceWidthMax value="2000"/>
+ <minLeftSideBearing value="0"/>
+ <minRightSideBearing value="0"/>
+ <xMaxExtent value="2000"/>
<caretSlopeRise value="1"/>
<caretSlopeRun value="0"/>
<caretOffset value="0"/>
@@ -160,17 +171,17 @@
<reserved2 value="0"/>
<reserved3 value="0"/>
<metricDataFormat value="0"/>
- <numberOfHMetrics value="117"/>
+ <numberOfHMetrics value="1"/>
</hhea>
<maxp>
<!-- Most of this table will be recalculated by the compiler -->
<tableVersion value="0x10000"/>
- <numGlyphs value="117"/>
- <maxPoints value="852"/>
- <maxContours value="43"/>
- <maxCompositePoints value="104"/>
- <maxCompositeContours value="12"/>
+ <numGlyphs value="128"/>
+ <maxPoints value="2"/>
+ <maxContours value="1"/>
+ <maxCompositePoints value="0"/>
+ <maxCompositeContours value="0"/>
<maxZones value="2"/>
<maxTwilightPoints value="16"/>
<maxStorage value="153"/>
@@ -179,250 +190,142 @@
<maxStackElements value="1045"/>
<maxSizeOfInstructions value="534"/>
<maxComponentElements value="8"/>
- <maxComponentDepth value="4"/>
+ <maxComponentDepth value="0"/>
</maxp>
<hmtx>
- <mtx name=".notdef" width="1000" lsb="0"/>
- <mtx name="glyph00001" width="1000" lsb="0"/>
- <mtx name="glyph00002" width="1000" lsb="0"/>
- <mtx name="glyph00003" width="1000" lsb="0"/>
- <mtx name="glyph00004" width="1000" lsb="0"/>
- <mtx name="glyph00005" width="1000" lsb="0"/>
- <mtx name="glyph00006" width="1000" lsb="0"/>
- <mtx name="glyph00007" width="1000" lsb="0"/>
- <mtx name="glyph00008" width="1000" lsb="0"/>
- <mtx name="glyph00009" width="1000" lsb="0"/>
- <mtx name="glyph00010" width="1000" lsb="0"/>
- <mtx name="glyph00011" width="1000" lsb="0"/>
- <mtx name="glyph00012" width="1000" lsb="0"/>
- <mtx name="glyph00013" width="1000" lsb="0"/>
- <mtx name="glyph00014" width="1000" lsb="0"/>
- <mtx name="glyph00015" width="1000" lsb="0"/>
- <mtx name="glyph00016" width="1000" lsb="0"/>
- <mtx name="glyph00017" width="1000" lsb="0"/>
- <mtx name="glyph00018" width="1000" lsb="0"/>
- <mtx name="glyph00019" width="1000" lsb="0"/>
- <mtx name="glyph00020" width="1000" lsb="0"/>
- <mtx name="glyph00021" width="1000" lsb="0"/>
- <mtx name="glyph00022" width="1000" lsb="0"/>
- <mtx name="glyph00023" width="1000" lsb="0"/>
- <mtx name="glyph00024" width="1000" lsb="0"/>
- <mtx name="glyph00025" width="1000" lsb="0"/>
- <mtx name="glyph00026" width="1000" lsb="0"/>
- <mtx name="glyph00027" width="1000" lsb="0"/>
- <mtx name="glyph00028" width="1000" lsb="0"/>
- <mtx name="glyph00029" width="1000" lsb="0"/>
- <mtx name="glyph00030" width="1000" lsb="0"/>
- <mtx name="glyph00031" width="1000" lsb="0"/>
- <mtx name="glyph00032" width="1000" lsb="0"/>
- <mtx name="glyph00033" width="1000" lsb="0"/>
- <mtx name="glyph00034" width="1000" lsb="0"/>
- <mtx name="glyph00035" width="1000" lsb="0"/>
- <mtx name="glyph00036" width="1000" lsb="0"/>
- <mtx name="glyph00037" width="1000" lsb="0"/>
- <mtx name="glyph00038" width="1000" lsb="0"/>
- <mtx name="glyph00039" width="1000" lsb="0"/>
- <mtx name="glyph00040" width="1000" lsb="0"/>
- <mtx name="glyph00041" width="1000" lsb="0"/>
- <mtx name="glyph00042" width="1000" lsb="0"/>
- <mtx name="glyph00043" width="1000" lsb="0"/>
- <mtx name="glyph00044" width="1000" lsb="0"/>
- <mtx name="glyph00045" width="1000" lsb="0"/>
- <mtx name="glyph00046" width="1000" lsb="0"/>
- <mtx name="glyph00047" width="1000" lsb="0"/>
- <mtx name="glyph00048" width="1000" lsb="0"/>
- <mtx name="glyph00049" width="1000" lsb="0"/>
- <mtx name="glyph00050" width="1000" lsb="0"/>
- <mtx name="glyph00051" width="1000" lsb="0"/>
- <mtx name="glyph00052" width="1000" lsb="0"/>
- <mtx name="glyph00053" width="1000" lsb="0"/>
- <mtx name="glyph00054" width="1000" lsb="0"/>
- <mtx name="glyph00055" width="1000" lsb="0"/>
- <mtx name="glyph00056" width="1000" lsb="0"/>
- <mtx name="glyph00057" width="1000" lsb="0"/>
- <mtx name="glyph00058" width="1000" lsb="0"/>
- <mtx name="glyph00059" width="1000" lsb="0"/>
- <mtx name="glyph00060" width="1000" lsb="0"/>
- <mtx name="glyph00061" width="1000" lsb="0"/>
- <mtx name="glyph00062" width="1000" lsb="0"/>
- <mtx name="glyph00063" width="1000" lsb="0"/>
- <mtx name="glyph00064" width="1000" lsb="0"/>
- <mtx name="glyph00065" width="1000" lsb="0"/>
- <mtx name="glyph00066" width="1000" lsb="0"/>
- <mtx name="glyph00067" width="1000" lsb="0"/>
- <mtx name="glyph00068" width="1000" lsb="0"/>
- <mtx name="glyph00069" width="1000" lsb="0"/>
- <mtx name="glyph00070" width="1000" lsb="0"/>
- <mtx name="glyph00071" width="1000" lsb="0"/>
- <mtx name="glyph00072" width="1000" lsb="0"/>
- <mtx name="glyph00073" width="1000" lsb="0"/>
- <mtx name="glyph00074" width="1000" lsb="0"/>
- <mtx name="glyph00075" width="1000" lsb="0"/>
- <mtx name="glyph00076" width="1000" lsb="0"/>
- <mtx name="glyph00077" width="1000" lsb="0"/>
- <mtx name="glyph00078" width="1000" lsb="0"/>
- <mtx name="glyph00079" width="1000" lsb="0"/>
- <mtx name="glyph00080" width="1000" lsb="0"/>
- <mtx name="glyph00081" width="1000" lsb="0"/>
- <mtx name="glyph00082" width="1000" lsb="0"/>
- <mtx name="glyph00083" width="1000" lsb="0"/>
- <mtx name="glyph00084" width="1000" lsb="0"/>
- <mtx name="glyph00085" width="1000" lsb="0"/>
- <mtx name="glyph00086" width="1000" lsb="0"/>
- <mtx name="glyph00087" width="1000" lsb="0"/>
- <mtx name="glyph00088" width="1000" lsb="0"/>
- <mtx name="glyph00089" width="1000" lsb="0"/>
- <mtx name="glyph00090" width="1000" lsb="0"/>
- <mtx name="glyph00091" width="1000" lsb="0"/>
- <mtx name="glyph00092" width="1000" lsb="0"/>
- <mtx name="glyph00093" width="1000" lsb="0"/>
- <mtx name="glyph00094" width="1000" lsb="0"/>
- <mtx name="glyph00095" width="1000" lsb="0"/>
- <mtx name="glyph00096" width="1000" lsb="0"/>
- <mtx name="glyph00097" width="1000" lsb="0"/>
- <mtx name="glyph00098" width="1000" lsb="0"/>
- <mtx name="glyph00099" width="1000" lsb="0"/>
- <mtx name="glyph00100" width="1000" lsb="0"/>
- <mtx name="glyph00101" width="1000" lsb="0"/>
- <mtx name="glyph00102" width="1000" lsb="0"/>
- <mtx name="glyph00103" width="1000" lsb="0"/>
- <mtx name="glyph00104" width="1000" lsb="0"/>
- <mtx name="glyph00105" width="1000" lsb="0"/>
- <mtx name="glyph00106" width="1000" lsb="0"/>
- <mtx name="glyph00107" width="1000" lsb="0"/>
- <mtx name="glyph00108" width="1000" lsb="0"/>
- <mtx name="glyph00109" width="1000" lsb="0"/>
- <mtx name="glyph00110" width="1000" lsb="0"/>
- <mtx name="glyph00111" width="1000" lsb="0"/>
- <mtx name="glyph00112" width="1000" lsb="0"/>
- <mtx name="glyph00113" width="1000" lsb="0"/>
- <mtx name="glyph00114" width="1000" lsb="0"/>
- <mtx name="glyph00115" width="1000" lsb="0"/>
- <mtx name="glyph00116" width="1000" lsb="0"/>
+ <mtx name=".notdef" width="2000" lsb="0"/>
+ <mtx name="glyph00001" width="2000" lsb="0"/>
+ <mtx name="glyph00002" width="2000" lsb="0"/>
+ <mtx name="glyph00003" width="2000" lsb="0"/>
+ <mtx name="glyph00004" width="2000" lsb="0"/>
+ <mtx name="glyph00005" width="2000" lsb="0"/>
+ <mtx name="glyph00006" width="2000" lsb="0"/>
+ <mtx name="glyph00007" width="2000" lsb="0"/>
+ <mtx name="glyph00008" width="2000" lsb="0"/>
+ <mtx name="glyph00009" width="2000" lsb="0"/>
+ <mtx name="glyph00010" width="2000" lsb="0"/>
+ <mtx name="glyph00011" width="2000" lsb="0"/>
+ <mtx name="glyph00012" width="2000" lsb="0"/>
+ <mtx name="glyph00013" width="2000" lsb="0"/>
+ <mtx name="glyph00014" width="2000" lsb="0"/>
+ <mtx name="glyph00015" width="2000" lsb="0"/>
+ <mtx name="glyph00016" width="2000" lsb="0"/>
+ <mtx name="glyph00017" width="2000" lsb="0"/>
+ <mtx name="glyph00018" width="2000" lsb="0"/>
+ <mtx name="glyph00019" width="2000" lsb="0"/>
+ <mtx name="glyph00020" width="2000" lsb="0"/>
+ <mtx name="glyph00021" width="2000" lsb="0"/>
+ <mtx name="glyph00022" width="2000" lsb="0"/>
+ <mtx name="glyph00023" width="2000" lsb="0"/>
+ <mtx name="glyph00024" width="2000" lsb="0"/>
+ <mtx name="glyph00025" width="2000" lsb="0"/>
+ <mtx name="glyph00026" width="2000" lsb="0"/>
+ <mtx name="glyph00027" width="2000" lsb="0"/>
+ <mtx name="glyph00028" width="2000" lsb="0"/>
+ <mtx name="glyph00029" width="2000" lsb="0"/>
+ <mtx name="glyph00030" width="2000" lsb="0"/>
+ <mtx name="glyph00031" width="2000" lsb="0"/>
+ <mtx name="glyph00032" width="2000" lsb="0"/>
+ <mtx name="glyph00033" width="2000" lsb="0"/>
+ <mtx name="glyph00034" width="2000" lsb="0"/>
+ <mtx name="glyph00035" width="2000" lsb="0"/>
+ <mtx name="glyph00036" width="2000" lsb="0"/>
+ <mtx name="glyph00037" width="2000" lsb="0"/>
+ <mtx name="glyph00038" width="2000" lsb="0"/>
+ <mtx name="glyph00039" width="2000" lsb="0"/>
+ <mtx name="glyph00040" width="2000" lsb="0"/>
+ <mtx name="glyph00041" width="2000" lsb="0"/>
+ <mtx name="glyph00042" width="2000" lsb="0"/>
+ <mtx name="glyph00043" width="2000" lsb="0"/>
+ <mtx name="glyph00044" width="2000" lsb="0"/>
+ <mtx name="glyph00045" width="2000" lsb="0"/>
+ <mtx name="glyph00046" width="2000" lsb="0"/>
+ <mtx name="glyph00047" width="2000" lsb="0"/>
+ <mtx name="glyph00048" width="2000" lsb="0"/>
+ <mtx name="glyph00049" width="2000" lsb="0"/>
+ <mtx name="glyph00050" width="2000" lsb="0"/>
+ <mtx name="glyph00051" width="2000" lsb="0"/>
+ <mtx name="glyph00052" width="2000" lsb="0"/>
+ <mtx name="glyph00053" width="2000" lsb="0"/>
+ <mtx name="glyph00054" width="2000" lsb="0"/>
+ <mtx name="glyph00055" width="2000" lsb="0"/>
+ <mtx name="glyph00056" width="2000" lsb="0"/>
+ <mtx name="glyph00057" width="2000" lsb="0"/>
+ <mtx name="glyph00058" width="2000" lsb="0"/>
+ <mtx name="glyph00059" width="2000" lsb="0"/>
+ <mtx name="glyph00060" width="2000" lsb="0"/>
+ <mtx name="glyph00061" width="2000" lsb="0"/>
+ <mtx name="glyph00062" width="2000" lsb="0"/>
+ <mtx name="glyph00063" width="2000" lsb="0"/>
+ <mtx name="glyph00064" width="2000" lsb="0"/>
+ <mtx name="glyph00065" width="2000" lsb="0"/>
+ <mtx name="glyph00066" width="2000" lsb="0"/>
+ <mtx name="glyph00067" width="2000" lsb="0"/>
+ <mtx name="glyph00068" width="2000" lsb="0"/>
+ <mtx name="glyph00069" width="2000" lsb="0"/>
+ <mtx name="glyph00070" width="2000" lsb="0"/>
+ <mtx name="glyph00071" width="2000" lsb="0"/>
+ <mtx name="glyph00072" width="2000" lsb="0"/>
+ <mtx name="glyph00073" width="2000" lsb="0"/>
+ <mtx name="glyph00074" width="2000" lsb="0"/>
+ <mtx name="glyph00075" width="2000" lsb="0"/>
+ <mtx name="glyph00076" width="2000" lsb="0"/>
+ <mtx name="glyph00077" width="2000" lsb="0"/>
+ <mtx name="glyph00078" width="2000" lsb="0"/>
+ <mtx name="glyph00079" width="2000" lsb="0"/>
+ <mtx name="glyph00080" width="2000" lsb="0"/>
+ <mtx name="glyph00081" width="2000" lsb="0"/>
+ <mtx name="glyph00082" width="2000" lsb="0"/>
+ <mtx name="glyph00083" width="2000" lsb="0"/>
+ <mtx name="glyph00084" width="2000" lsb="0"/>
+ <mtx name="glyph00085" width="2000" lsb="0"/>
+ <mtx name="glyph00086" width="2000" lsb="0"/>
+ <mtx name="glyph00087" width="2000" lsb="0"/>
+ <mtx name="glyph00088" width="2000" lsb="0"/>
+ <mtx name="glyph00089" width="2000" lsb="0"/>
+ <mtx name="glyph00090" width="2000" lsb="0"/>
+ <mtx name="glyph00091" width="2000" lsb="0"/>
+ <mtx name="glyph00092" width="2000" lsb="0"/>
+ <mtx name="glyph00093" width="2000" lsb="0"/>
+ <mtx name="glyph00094" width="2000" lsb="0"/>
+ <mtx name="glyph00095" width="2000" lsb="0"/>
+ <mtx name="glyph00096" width="2000" lsb="0"/>
+ <mtx name="glyph00097" width="2000" lsb="0"/>
+ <mtx name="glyph00098" width="2000" lsb="0"/>
+ <mtx name="glyph00099" width="2000" lsb="0"/>
+ <mtx name="glyph00100" width="2000" lsb="0"/>
+ <mtx name="glyph00101" width="2000" lsb="0"/>
+ <mtx name="glyph00102" width="2000" lsb="0"/>
+ <mtx name="glyph00103" width="2000" lsb="0"/>
+ <mtx name="glyph00104" width="2000" lsb="0"/>
+ <mtx name="glyph00105" width="2000" lsb="0"/>
+ <mtx name="glyph00106" width="2000" lsb="0"/>
+ <mtx name="glyph00107" width="2000" lsb="0"/>
+ <mtx name="glyph00108" width="2000" lsb="0"/>
+ <mtx name="glyph00109" width="2000" lsb="0"/>
+ <mtx name="glyph00110" width="2000" lsb="0"/>
+ <mtx name="glyph00111" width="2000" lsb="0"/>
+ <mtx name="glyph00112" width="2000" lsb="0"/>
+ <mtx name="glyph00113" width="2000" lsb="0"/>
+ <mtx name="glyph00114" width="2000" lsb="0"/>
+ <mtx name="glyph00115" width="2000" lsb="0"/>
+ <mtx name="glyph00116" width="2000" lsb="0"/>
+ <mtx name="glyph00117" width="2000" lsb="0"/>
+ <mtx name="glyph00118" width="2000" lsb="0"/>
+ <mtx name="glyph00119" width="2000" lsb="0"/>
+ <mtx name="glyph00120" width="2000" lsb="0"/>
+ <mtx name="glyph00121" width="2000" lsb="0"/>
+ <mtx name="glyph00122" width="2000" lsb="0"/>
+ <mtx name="glyph00123" width="2000" lsb="0"/>
+ <mtx name="glyph00124" width="2000" lsb="0"/>
+ <mtx name="glyph00125" width="2000" lsb="0"/>
+ <mtx name="glyph00126" width="2000" lsb="0"/>
+ <mtx name="glyph00127" width="2000" lsb="0"/>
</hmtx>
<cmap>
<tableVersion version="0"/>
- <cmap_format_4 platformID="3" platEncID="0" language="0">
- <map code="0xf000" name=".notdef"/>
- <map code="0xf001" name="glyph00001"/>
- <map code="0xf002" name="glyph00002"/>
- <map code="0xf003" name="glyph00003"/>
- <map code="0xf004" name="glyph00004"/>
- <map code="0xf005" name="glyph00005"/>
- <map code="0xf006" name="glyph00006"/>
- <map code="0xf007" name="glyph00007"/>
- <map code="0xf008" name="glyph00008"/>
- <map code="0xf009" name="glyph00009"/>
- <map code="0xf00a" name="glyph00010"/>
- <map code="0xf00b" name="glyph00011"/>
- <map code="0xf00c" name="glyph00012"/>
- <map code="0xf00d" name="glyph00013"/>
- <map code="0xf00e" name="glyph00014"/>
- <map code="0xf00f" name="glyph00015"/>
- <map code="0xf010" name="glyph00016"/>
- <map code="0xf011" name="glyph00017"/>
- <map code="0xf012" name="glyph00018"/>
- <map code="0xf013" name="glyph00019"/>
- <map code="0xf014" name="glyph00020"/>
- <map code="0xf015" name="glyph00021"/>
- <map code="0xf016" name="glyph00022"/>
- <map code="0xf017" name="glyph00023"/>
- <map code="0xf018" name="glyph00024"/>
- <map code="0xf019" name="glyph00025"/>
- <map code="0xf01a" name="glyph00026"/>
- <map code="0xf01b" name="glyph00027"/>
- <map code="0xf01c" name="glyph00028"/>
- <map code="0xf01d" name="glyph00029"/>
- <map code="0xf01e" name="glyph00030"/>
- <map code="0xf01f" name="glyph00031"/>
- <map code="0xf020" name="glyph00032"/>
- <map code="0xf021" name="glyph00033"/>
- <map code="0xf022" name="glyph00034"/>
- <map code="0xf023" name="glyph00035"/>
- <map code="0xf024" name="glyph00036"/>
- <map code="0xf025" name="glyph00037"/>
- <map code="0xf026" name="glyph00038"/>
- <map code="0xf027" name="glyph00039"/>
- <map code="0xf028" name="glyph00040"/>
- <map code="0xf029" name="glyph00041"/>
- <map code="0xf02a" name="glyph00042"/>
- <map code="0xf02b" name="glyph00043"/>
- <map code="0xf02c" name="glyph00044"/>
- <map code="0xf02d" name="glyph00045"/>
- <map code="0xf02e" name="glyph00046"/>
- <map code="0xf02f" name="glyph00047"/>
- <map code="0xf030" name="glyph00048"/>
- <map code="0xf031" name="glyph00049"/>
- <map code="0xf032" name="glyph00050"/>
- <map code="0xf033" name="glyph00051"/>
- <map code="0xf034" name="glyph00052"/>
- <map code="0xf035" name="glyph00053"/>
- <map code="0xf036" name="glyph00054"/>
- <map code="0xf037" name="glyph00055"/>
- <map code="0xf038" name="glyph00056"/>
- <map code="0xf039" name="glyph00057"/>
- <map code="0xf03a" name="glyph00058"/>
- <map code="0xf03b" name="glyph00059"/>
- <map code="0xf03c" name="glyph00060"/>
- <map code="0xf03d" name="glyph00061"/>
- <map code="0xf03e" name="glyph00062"/>
- <map code="0xf03f" name="glyph00063"/>
- <map code="0xf040" name="glyph00064"/>
- <map code="0xf041" name="glyph00065"/>
- <map code="0xf042" name="glyph00066"/>
- <map code="0xf043" name="glyph00067"/>
- <map code="0xf044" name="glyph00068"/>
- <map code="0xf045" name="glyph00069"/>
- <map code="0xf046" name="glyph00070"/>
- <map code="0xf047" name="glyph00071"/>
- <map code="0xf048" name="glyph00072"/>
- <map code="0xf049" name="glyph00073"/>
- <map code="0xf04a" name="glyph00074"/>
- <map code="0xf04b" name="glyph00075"/>
- <map code="0xf04c" name="glyph00076"/>
- <map code="0xf04d" name="glyph00077"/>
- <map code="0xf04e" name="glyph00078"/>
- <map code="0xf04f" name="glyph00079"/>
- <map code="0xf050" name="glyph00080"/>
- <map code="0xf051" name="glyph00081"/>
- <map code="0xf052" name="glyph00082"/>
- <map code="0xf053" name="glyph00083"/>
- <map code="0xf054" name="glyph00084"/>
- <map code="0xf055" name="glyph00085"/>
- <map code="0xf056" name="glyph00086"/>
- <map code="0xf057" name="glyph00087"/>
- <map code="0xf058" name="glyph00088"/>
- <map code="0xf059" name="glyph00089"/>
- <map code="0xf05a" name="glyph00090"/>
- <map code="0xf05b" name="glyph00091"/>
- <map code="0xf05c" name="glyph00092"/>
- <map code="0xf05d" name="glyph00093"/>
- <map code="0xf05e" name="glyph00094"/>
- <map code="0xf05f" name="glyph00095"/>
- <map code="0xf060" name="glyph00096"/>
- <map code="0xf061" name="glyph00097"/>
- <map code="0xf062" name="glyph00098"/>
- <map code="0xf063" name="glyph00099"/>
- <map code="0xf064" name="glyph00100"/>
- <map code="0xf065" name="glyph00101"/>
- <map code="0xf066" name="glyph00102"/>
- <map code="0xf067" name="glyph00103"/>
- <map code="0xf068" name="glyph00104"/>
- <map code="0xf069" name="glyph00105"/>
- <map code="0xf06a" name="glyph00106"/>
- <map code="0xf06b" name="glyph00107"/>
- <map code="0xf06c" name="glyph00108"/>
- <map code="0xf06d" name="glyph00109"/>
- <map code="0xf06e" name="glyph00110"/>
- <map code="0xf06f" name="glyph00111"/>
- <map code="0xf070" name="glyph00112"/>
- <map code="0xf071" name="glyph00113"/>
- <map code="0xf072" name="glyph00114"/>
- <map code="0xf073" name="glyph00115"/>
- <map code="0xf074" name="glyph00116"/>
- </cmap_format_4>
<cmap_format_6 platformID="1" platEncID="0" language="0">
<map code="0x0" name=".notdef"/>
<map code="0x1" name="glyph00001"/>
@@ -541,7 +444,148 @@
<map code="0x72" name="glyph00114"/>
<map code="0x73" name="glyph00115"/>
<map code="0x74" name="glyph00116"/>
+ <map code="0x75" name="glyph00117"/>
+ <map code="0x76" name="glyph00118"/>
+ <map code="0x77" name="glyph00119"/>
+ <map code="0x78" name="glyph00120"/>
+ <map code="0x79" name="glyph00121"/>
+ <map code="0x7a" name="glyph00122"/>
+ <map code="0x7b" name="glyph00123"/>
+ <map code="0x7c" name="glyph00124"/>
+ <map code="0x7d" name="glyph00125"/>
+ <map code="0x7e" name="glyph00126"/>
+ <map code="0x7f" name="glyph00127"/>
</cmap_format_6>
+ <cmap_format_4 platformID="3" platEncID="0" language="0">
+ <map code="0xf000" name=".notdef"/>
+ <map code="0xf001" name="glyph00001"/>
+ <map code="0xf002" name="glyph00002"/>
+ <map code="0xf003" name="glyph00003"/>
+ <map code="0xf004" name="glyph00004"/>
+ <map code="0xf005" name="glyph00005"/>
+ <map code="0xf006" name="glyph00006"/>
+ <map code="0xf007" name="glyph00007"/>
+ <map code="0xf008" name="glyph00008"/>
+ <map code="0xf009" name="glyph00009"/>
+ <map code="0xf00a" name="glyph00010"/>
+ <map code="0xf00b" name="glyph00011"/>
+ <map code="0xf00c" name="glyph00012"/>
+ <map code="0xf00d" name="glyph00013"/>
+ <map code="0xf00e" name="glyph00014"/>
+ <map code="0xf00f" name="glyph00015"/>
+ <map code="0xf010" name="glyph00016"/>
+ <map code="0xf011" name="glyph00017"/>
+ <map code="0xf012" name="glyph00018"/>
+ <map code="0xf013" name="glyph00019"/>
+ <map code="0xf014" name="glyph00020"/>
+ <map code="0xf015" name="glyph00021"/>
+ <map code="0xf016" name="glyph00022"/>
+ <map code="0xf017" name="glyph00023"/>
+ <map code="0xf018" name="glyph00024"/>
+ <map code="0xf019" name="glyph00025"/>
+ <map code="0xf01a" name="glyph00026"/>
+ <map code="0xf01b" name="glyph00027"/>
+ <map code="0xf01c" name="glyph00028"/>
+ <map code="0xf01d" name="glyph00029"/>
+ <map code="0xf01e" name="glyph00030"/>
+ <map code="0xf01f" name="glyph00031"/>
+ <map code="0xf020" name="glyph00032"/>
+ <map code="0xf021" name="glyph00033"/>
+ <map code="0xf022" name="glyph00034"/>
+ <map code="0xf023" name="glyph00035"/>
+ <map code="0xf024" name="glyph00036"/>
+ <map code="0xf025" name="glyph00037"/>
+ <map code="0xf026" name="glyph00038"/>
+ <map code="0xf027" name="glyph00039"/>
+ <map code="0xf028" name="glyph00040"/>
+ <map code="0xf029" name="glyph00041"/>
+ <map code="0xf02a" name="glyph00042"/>
+ <map code="0xf02b" name="glyph00043"/>
+ <map code="0xf02c" name="glyph00044"/>
+ <map code="0xf02d" name="glyph00045"/>
+ <map code="0xf02e" name="glyph00046"/>
+ <map code="0xf02f" name="glyph00047"/>
+ <map code="0xf030" name="glyph00048"/>
+ <map code="0xf031" name="glyph00049"/>
+ <map code="0xf032" name="glyph00050"/>
+ <map code="0xf033" name="glyph00051"/>
+ <map code="0xf034" name="glyph00052"/>
+ <map code="0xf035" name="glyph00053"/>
+ <map code="0xf036" name="glyph00054"/>
+ <map code="0xf037" name="glyph00055"/>
+ <map code="0xf038" name="glyph00056"/>
+ <map code="0xf039" name="glyph00057"/>
+ <map code="0xf03a" name="glyph00058"/>
+ <map code="0xf03b" name="glyph00059"/>
+ <map code="0xf03c" name="glyph00060"/>
+ <map code="0xf03d" name="glyph00061"/>
+ <map code="0xf03e" name="glyph00062"/>
+ <map code="0xf03f" name="glyph00063"/>
+ <map code="0xf040" name="glyph00064"/>
+ <map code="0xf041" name="glyph00065"/>
+ <map code="0xf042" name="glyph00066"/>
+ <map code="0xf043" name="glyph00067"/>
+ <map code="0xf044" name="glyph00068"/>
+ <map code="0xf045" name="glyph00069"/>
+ <map code="0xf046" name="glyph00070"/>
+ <map code="0xf047" name="glyph00071"/>
+ <map code="0xf048" name="glyph00072"/>
+ <map code="0xf049" name="glyph00073"/>
+ <map code="0xf04a" name="glyph00074"/>
+ <map code="0xf04b" name="glyph00075"/>
+ <map code="0xf04c" name="glyph00076"/>
+ <map code="0xf04d" name="glyph00077"/>
+ <map code="0xf04e" name="glyph00078"/>
+ <map code="0xf04f" name="glyph00079"/>
+ <map code="0xf050" name="glyph00080"/>
+ <map code="0xf051" name="glyph00081"/>
+ <map code="0xf052" name="glyph00082"/>
+ <map code="0xf053" name="glyph00083"/>
+ <map code="0xf054" name="glyph00084"/>
+ <map code="0xf055" name="glyph00085"/>
+ <map code="0xf056" name="glyph00086"/>
+ <map code="0xf057" name="glyph00087"/>
+ <map code="0xf058" name="glyph00088"/>
+ <map code="0xf059" name="glyph00089"/>
+ <map code="0xf05a" name="glyph00090"/>
+ <map code="0xf05b" name="glyph00091"/>
+ <map code="0xf05c" name="glyph00092"/>
+ <map code="0xf05d" name="glyph00093"/>
+ <map code="0xf05e" name="glyph00094"/>
+ <map code="0xf05f" name="glyph00095"/>
+ <map code="0xf060" name="glyph00096"/>
+ <map code="0xf061" name="glyph00097"/>
+ <map code="0xf062" name="glyph00098"/>
+ <map code="0xf063" name="glyph00099"/>
+ <map code="0xf064" name="glyph00100"/>
+ <map code="0xf065" name="glyph00101"/>
+ <map code="0xf066" name="glyph00102"/>
+ <map code="0xf067" name="glyph00103"/>
+ <map code="0xf068" name="glyph00104"/>
+ <map code="0xf069" name="glyph00105"/>
+ <map code="0xf06a" name="glyph00106"/>
+ <map code="0xf06b" name="glyph00107"/>
+ <map code="0xf06c" name="glyph00108"/>
+ <map code="0xf06d" name="glyph00109"/>
+ <map code="0xf06e" name="glyph00110"/>
+ <map code="0xf06f" name="glyph00111"/>
+ <map code="0xf070" name="glyph00112"/>
+ <map code="0xf071" name="glyph00113"/>
+ <map code="0xf072" name="glyph00114"/>
+ <map code="0xf073" name="glyph00115"/>
+ <map code="0xf074" name="glyph00116"/>
+ <map code="0xf075" name="glyph00117"/>
+ <map code="0xf076" name="glyph00118"/>
+ <map code="0xf077" name="glyph00119"/>
+ <map code="0xf078" name="glyph00120"/>
+ <map code="0xf079" name="glyph00121"/>
+ <map code="0xf07a" name="glyph00122"/>
+ <map code="0xf07b" name="glyph00123"/>
+ <map code="0xf07c" name="glyph00124"/>
+ <map code="0xf07d" name="glyph00125"/>
+ <map code="0xf07e" name="glyph00126"/>
+ <map code="0xf07f" name="glyph00127"/>
+ </cmap_format_4>
</cmap>
<loca>
@@ -549,245 +593,1155 @@
</loca>
<glyf>
+
<!-- The xMin, yMin, xMax and yMax values
will be recalculated by the compiler. -->
- <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name=".notdef"/><!-- contains no outline data -->
+
+ <TTGlyph name="glyph00001" xMin="0" yMin="0" xMax="2000" yMax="2000">
<contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
</contour>
<instructions><assembly>
</assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00001" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00002" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00002" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00003" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00003" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00004" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00004" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00005" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00005" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00006" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00006" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00007" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00007" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00008" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00008" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00009" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00009" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00010" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00010" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00011" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00011" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00012" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00012" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00013" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00013" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00014" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00014" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00015" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00015" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00016" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00016" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00017" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00017" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00018" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00018" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00019" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00019" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00020" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00020" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00021" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00021" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00022" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00022" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00023" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00023" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00024" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00024" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00025" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00025" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00026" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00026" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00027" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00027" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00028" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00028" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00029" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00029" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00030" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00030" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00031" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00031" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00032" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00032" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00033" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00033" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00034" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00034" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00035" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00035" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00036" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00036" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00037" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
+ </contour>
+ <instructions><assembly>
+ </assembly></instructions>
</TTGlyph>
- <TTGlyph name="glyph00037" xMin="0" yMin="0" xMax="1000" yMax="1000">
+
+ <TTGlyph name="glyph00038" xMin="0" yMin="0" xMax="2000" yMax="2000">
+ <contour>
+ <pt x="0" y="0" on="0"/>
+ <pt x="2000" y="2000" on="0"/>
***The diff for this file has been truncated for email.***
==============================================================================
Revision: 242b14ae7f38
Author: Ray Smith <
ra...@google.com>
Date: Thu Oct 9 20:29:46 2014 UTC
Log: Reduced size of multi-renderer implementation from code review
https://code.google.com/p/tesseract-ocr/source/detail?r=242b14ae7f38
Modified:
/api/tesseractmain.cpp
=======================================
--- /api/tesseractmain.cpp Fri Sep 19 21:33:47 2014 UTC
+++ /api/tesseractmain.cpp Thu Oct 9 20:29:46 2014 UTC
@@ -287,54 +287,38 @@
exit(ret_val);
}
- tesseract::TessResultRenderer* renderer = NULL;
bool b;
+ tesseract::PointerVector<tesseract::TessResultRenderer> renderers;
api.GetBoolVariable("tessedit_create_hocr", &b);
if (b) {
bool font_info;
api.GetBoolVariable("hocr_font_info", &font_info);
- renderer = new tesseract::TessHOcrRenderer(outputbase, font_info);
+ renderers.push_back(new tesseract::TessHOcrRenderer(outputbase,
font_info));
}
-
api.GetBoolVariable("tessedit_create_pdf", &b);
if (b) {
- if (renderer == NULL)
- renderer = new tesseract::TessPDFRenderer(outputbase,
api.GetDatapath());
- else
- renderer->insert(new tesseract::TessPDFRenderer(outputbase,
- api.GetDatapath()));
+ renderers.push_back(new tesseract::TessPDFRenderer(outputbase,
+ api.GetDatapath()));
}
-
api.GetBoolVariable("tessedit_write_unlv", &b);
- if (b) {
- if (renderer == NULL)
- renderer = new tesseract::TessUnlvRenderer(outputbase);
- else
- renderer->insert(new tesseract::TessUnlvRenderer(outputbase));
- }
-
+ if (b) renderers.push_back(new tesseract::TessUnlvRenderer(outputbase));
api.GetBoolVariable("tessedit_create_boxfile", &b);
- if (b) {
- if (renderer == NULL)
- renderer = new tesseract::TessBoxTextRenderer(outputbase);
- else
- renderer->insert(new tesseract::TessBoxTextRenderer(outputbase));
- }
-
+ if (b) renderers.push_back(new
tesseract::TessBoxTextRenderer(outputbase));
api.GetBoolVariable("tessedit_create_txt", &b);
- if (b) {
- if (renderer == NULL)
- renderer = new tesseract::TessTextRenderer(outputbase);
- else
- renderer->insert(new tesseract::TessTextRenderer(outputbase));
+ if (b) renderers.push_back(new tesseract::TessTextRenderer(outputbase));
+ if (!renderers.empty()) {
+ // Since the PointerVector auto-deletes, null-out the renderers that
are
+ // added to the root, and leave the root in the vector.
+ for (int r = 1; r < renderers.size(); ++r) {
+ renderers[0]->insert(renderers[r]);
+ renderers[r] = NULL;
+ }
+ if (!api.ProcessPages(image, NULL, 0, renderers[0])) {
+ fprintf(stderr, "Error during processing.\n");
+ exit(1);
+ }
}
- if (!api.ProcessPages(image, NULL, 0, renderer)) {
- delete renderer;
- fprintf(stderr, "Error during processing.\n");
- exit(1);
- }
- delete renderer;
PERF_COUNT_END
return 0; // Normal exit
}