static int xps_true_callback_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont, gs_char chr, gs_glyph glyph) { gs_font_type42 *p42 = (gs_font_type42*)pfont; const gs_rect *pbbox; float sbw[4], w2[6]; gs_fixed_point saved_adjust; int code; // dprintf1("build char ttf %d\n", glyph); code = gs_type42_get_metrics(p42, glyph, sbw); if (code < 0) return code; w2[0] = sbw[2]; w2[1] = sbw[3]; pbbox = &p42->FontBBox; w2[2] = pbbox->p.x; w2[3] = pbbox->p.y; w2[4] = pbbox->q.x; w2[5] = pbbox->q.y; /* Expand the bbox when stroking */ if ( pfont->PaintType ) { float expand = max(1.415, gs_currentmiterlimit(pgs)) * gs_currentlinewidth(pgs) / 2; w2[2] -= expand, w2[3] -= expand; w2[4] += expand, w2[5] += expand; } if ( (code = gs_moveto(pgs, 0.0, 0.0)) < 0 ) return code; if ( (code = gs_setcachedevice(penum, pgs, w2)) < 0 ) return code; code = gs_type42_append(glyph, pgs, gx_current_path(pgs), (gs_text_enum_t*)penum, (gs_font*)p42, gs_show_in_charpath(penum) != cpm_show); if (code < 0) return code; /* Indicate that dropout prevention should be enabled by setting fill_adjust to the special value -1. */ saved_adjust = pgs->fill_adjust; pgs->fill_adjust.x = -1; pgs->fill_adjust.y = -1; code = (pfont->PaintType ? gs_stroke(pgs) : gs_fill(pgs)); if (code < 0) return code; pgs->fill_adjust = saved_adjust; return 0; }
/* <userpath1> <userpath2> <matrix> inustroke <bool> */ static int zinustroke(i_ctx_t *i_ctx_p) { /* This is different because of the optional matrix operand. */ os_ptr op = osp; int code = gs_gsave(igs); int spop, npop; gs_matrix mat; gx_device hdev; if (code < 0) return code; if ((spop = upath_stroke(i_ctx_p, &mat, false)) < 0) { gs_grestore(igs); return spop; } if ((npop = in_path(op - spop, i_ctx_p, &hdev)) < 0) { gs_grestore(igs); return npop; } if (npop > 1) /* matrix was supplied */ code = gs_concat(igs, &mat); if (code >= 0) code = gs_stroke(igs); return in_upath_result(i_ctx_p, npop + spop, code); }
/* <userpath> <matrix> ustroke - */ static int zustroke(i_ctx_t *i_ctx_p) { int code = gs_gsave(igs); int npop; if (code < 0) return code; if ((code = npop = upath_stroke(i_ctx_p, NULL, gs_currentcpsimode(imemory))) >= 0) code = gs_stroke(igs); gs_grestore(igs); if (code < 0) return code; pop(npop); return 0; }
static int test4(gs_state * pgs, gs_memory_t * mem) { gs_c_param_list list; float resv[2]; gs_param_float_array ares; int code; gx_device *dev = gs_currentdevice(pgs); gs_c_param_list_write(&list, mem); resv[0] = resv[1] = 100; ares.data = resv; ares.size = 2; ares.persistent = true; code = param_write_float_array((gs_param_list *) & list, "HWResolution", &ares); if (code < 0) { lprintf1("Writing HWResolution failed: %d\n", code); gs_abort(mem); } gs_c_param_list_read(&list); code = gs_putdeviceparams(dev, (gs_param_list *) & list); gs_c_param_list_release(&list); if (code < 0) { lprintf1("Setting HWResolution failed: %d\n", code); gs_abort(mem); } gs_initmatrix(pgs); gs_initclip(pgs); if (code == 1) { code = (*dev_proc(dev, open_device)) (dev); if (code < 0) { lprintf1("Reopening device failed: %d\n", code); gs_abort(mem); } } gs_moveto(pgs, 0.0, 72.0); gs_rlineto(pgs, 72.0, 0.0); gs_rlineto(pgs, 0.0, 72.0); gs_closepath(pgs); gs_stroke(pgs); return 0; }
/* (We could do this a lot more efficiently.) */ int gs_rectstroke(gs_state * pgs, const gs_rect * pr, uint count, const gs_matrix * pmat) { bool do_save = pmat != NULL || !gx_path_is_null(pgs->path); int code; if (do_save) { if ((code = gs_gsave(pgs)) < 0) return code; gs_newpath(pgs); } if ((code = gs_rectappend(pgs, pr, count)) < 0 || (pmat != NULL && (code = gs_concat(pgs, pmat)) < 0) || (code = gs_stroke(pgs)) < 0 ) DO_NOTHING; if (do_save) gs_grestore(pgs); else if (code < 0) gs_newpath(pgs); return code; }
/* Add a symbol to the path. */ static int hpgl_stick_arc_build_char(gs_show_enum *penum, gs_state *pgs, gs_font *pfont, gs_glyph uni_code, hpgl_font_type_t font_type) { int width; gs_matrix save_ctm; int code; /* we assert the font is present at this point */ width = hpgl_stick_arc_width(uni_code, font_type); /* *** incorrect comment The TRM says the stick font is based on a 32x32 unit cell, */ /* but the font we're using here is only 15x15. */ /* Also, per TRM 23-18, the character cell is only 2/3 the */ /* point size. */ gs_setcharwidth(penum, pgs, width / 1024.0 * 0.667, 0.0); gs_currentmatrix(pgs, &save_ctm); gs_scale(pgs, 1.0 / 1024.0 * .667, 1.0 / 1024.0 * .667); gs_moveto(pgs, 0.0, 0.0); code = hpgl_stick_arc_segments(pfont->memory, (void *)pgs, uni_code, font_type); if ( code < 0 ) return code; gs_setdefaultmatrix(pgs, NULL); gs_initmatrix(pgs); /* Set predictable join and cap styles. */ gs_setlinejoin(pgs, gs_join_round); gs_setmiterlimit(pgs, 2.61); /* start beveling at 45 degrees */ gs_setlinecap(pgs, gs_cap_round); { float pattern[1]; gs_setdash(pgs, pattern, 0, 0); } gs_stroke(pgs); gs_setmatrix(pgs, &save_ctm); return 0; }