jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno)
(dev, span, type_, ctm, colorspace, color, alpha, seqno)
| 22787 | |
| 22788 | |
| 22789 | def jm_trace_text_span(dev, span, type_, ctm, colorspace, color, alpha, seqno): |
| 22790 | ''' |
| 22791 | jm_trace_text_span(fz_context *ctx, PyObject *out, fz_text_span *span, int type, fz_matrix ctm, fz_colorspace *colorspace, const float *color, float alpha, size_t seqno) |
| 22792 | ''' |
| 22793 | out_font = None |
| 22794 | assert isinstance( span, mupdf.fz_text_span) |
| 22795 | span = mupdf.FzTextSpan( span) |
| 22796 | assert isinstance( ctm, mupdf.fz_matrix) |
| 22797 | ctm = mupdf.FzMatrix( ctm) |
| 22798 | fontname = JM_font_name( span.font()) |
| 22799 | #float rgb[3]; |
| 22800 | #PyObject *chars = PyTuple_New(span->len); |
| 22801 | |
| 22802 | mat = mupdf.fz_concat(span.trm(), ctm) # text transformation matrix |
| 22803 | dir = mupdf.fz_transform_vector(mupdf.fz_make_point(1, 0), mat) # writing direction |
| 22804 | fsize = math.sqrt(dir.x * dir.x + dir.y * dir.y) # font size |
| 22805 | |
| 22806 | dir = mupdf.fz_normalize_vector(dir) |
| 22807 | |
| 22808 | space_adv = 0 |
| 22809 | asc = JM_font_ascender( span.font()) |
| 22810 | dsc = JM_font_descender( span.font()) |
| 22811 | if asc < 1e-3: # probably Tesseract font |
| 22812 | dsc = -0.1 |
| 22813 | asc = 0.9 |
| 22814 | |
| 22815 | # compute effective ascender / descender |
| 22816 | ascsize = asc * fsize / (asc - dsc) |
| 22817 | dscsize = dsc * fsize / (asc - dsc) |
| 22818 | fflags = 0 # font flags |
| 22819 | mono = mupdf.fz_font_is_monospaced( span.font()) |
| 22820 | fflags += mono * TEXT_FONT_MONOSPACED |
| 22821 | fflags += mupdf.fz_font_is_italic( span.font()) * TEXT_FONT_ITALIC |
| 22822 | fflags += mupdf.fz_font_is_serif( span.font()) * TEXT_FONT_SERIFED |
| 22823 | fflags += mupdf.fz_font_is_bold( span.font()) * TEXT_FONT_BOLD |
| 22824 | |
| 22825 | last_adv = 0 |
| 22826 | |
| 22827 | # walk through characters of span |
| 22828 | span_bbox = mupdf.FzRect() |
| 22829 | rot = mupdf.fz_make_matrix(dir.x, dir.y, -dir.y, dir.x, 0, 0) |
| 22830 | if dir.x == -1: # left-right flip |
| 22831 | rot.d = 1 |
| 22832 | |
| 22833 | chars = [] |
| 22834 | for i in range( span.m_internal.len): |
| 22835 | adv = 0 |
| 22836 | if span.items(i).gid >= 0: |
| 22837 | adv = mupdf.fz_advance_glyph( span.font(), span.items(i).gid, span.m_internal.wmode) |
| 22838 | adv *= fsize |
| 22839 | last_adv = adv |
| 22840 | if span.items(i).ucs == 32: |
| 22841 | space_adv = adv |
| 22842 | char_orig = mupdf.fz_make_point(span.items(i).x, span.items(i).y) |
| 22843 | char_orig = mupdf.fz_transform_point(char_orig, ctm) |
| 22844 | m1 = mupdf.fz_make_matrix(1, 0, 0, 1, -char_orig.x, -char_orig.y) |
| 22845 | m1 = mupdf.fz_concat(m1, rot) |
| 22846 | m1 = mupdf.fz_concat(m1, mupdf.FzMatrix(1, 0, 0, 1, char_orig.x, char_orig.y)) |
no test coverage detected
searching dependent graphs…