JNIEXPORT void JNICALL Java_com_draekko_libharu_PdfPage_curveTo (JNIEnv *env, jobject obj, jfloat x1, jfloat y1, jfloat x2, jfloat y2, jfloat x3, jfloat y3) { haru_setup_error_handler(env, __func__); HPDF_Page page = get_HPDF_Page(env, obj); HPDF_Page_CurveTo(page, x1, y1, x2, y2, x3, y3); haru_clear_error_handler(); }
/* * Class: org_libharu_PdfPage * Method: curveTo * Signature: (FFFFFF)V */ JNIEXPORT void JNICALL Java_org_libharu_PdfPage_curveTo(JNIEnv *env, jobject obj, jfloat x1, jfloat y1, jfloat x2, jfloat y2, jfloat x3, jfloat y3) { jint page; /* Get mHPDFPagePointer */ page = (*env)->GetIntField(env, obj, mHPDFPagePointer); HPDF_Page_CurveTo((HPDF_Page) page, (HPDF_REAL) x1, (HPDF_REAL) y1, (HPDF_REAL) x2, (HPDF_REAL) y2, (HPDF_REAL) x3, (HPDF_REAL) y3); }
bool pdf_plot_path(const float *p, unsigned int n, colour fill, float width, colour c, const float transform[6]) { unsigned int i; bool empty_path; #ifdef PDF_DEBUG NSLOG(netsurf, INFO, "."); #endif if (n == 0) return true; if (c == NS_TRANSPARENT && fill == NS_TRANSPARENT) return true; if (p[0] != PLOTTER_PATH_MOVE) return false; apply_clip_and_mode(false, fill, c, width, DashPattern_eNone); empty_path = true; for (i = 0 ; i < n ; ) { if (p[i] == PLOTTER_PATH_MOVE) { HPDF_Page_MoveTo(pdf_page, transform_x(transform, p[i+1], p[i+2]), transform_y(transform, p[i+1], p[i+2])); i+= 3; } else if (p[i] == PLOTTER_PATH_CLOSE) { if (!empty_path) HPDF_Page_ClosePath(pdf_page); i++; } else if (p[i] == PLOTTER_PATH_LINE) { HPDF_Page_LineTo(pdf_page, transform_x(transform, p[i+1], p[i+2]), transform_y(transform, p[i+1], p[i+2])); i+=3; empty_path = false; } else if (p[i] == PLOTTER_PATH_BEZIER) { HPDF_Page_CurveTo(pdf_page, transform_x(transform, p[i+1], p[i+2]), transform_y(transform, p[i+1], p[i+2]), transform_x(transform, p[i+3], p[i+4]), transform_y(transform, p[i+3], p[i+4]), transform_x(transform, p[i+5], p[i+6]), transform_y(transform, p[i+5], p[i+6])); i += 7; empty_path = false; } else { NSLOG(netsurf, INFO, "bad path command %f", p[i]); return false; } } if (empty_path) { HPDF_Page_EndPath(pdf_page); return true; } if (fill != NS_TRANSPARENT) { if (c != NS_TRANSPARENT) HPDF_Page_FillStroke(pdf_page); else HPDF_Page_Fill(pdf_page); } else HPDF_Page_Stroke(pdf_page); return true; }
void WPdfImage::drawPlainPath(const WPainterPath& path) { if (path.isEmpty()) return; const std::vector<WPainterPath::Segment>& segments = path.segments(); if (segments.size() > 0 && segments[0].type() != SegmentType::MoveTo) HPDF_Page_MoveTo(page_, 0, 0); for (unsigned i = 0; i < segments.size(); ++i) { const WPainterPath::Segment s = segments[i]; switch (s.type()) { case SegmentType::MoveTo: HPDF_Page_MoveTo(page_, s.x(), s.y()); break; case SegmentType::LineTo: HPDF_Page_LineTo(page_, s.x(), s.y()); break; case SegmentType::CubicC1: { const double x1 = s.x(); const double y1 = s.y(); const double x2 = segments[i+1].x(); const double y2 = segments[i+1].y(); const double x3 = segments[i+2].x(); const double y3 = segments[i+2].y(); HPDF_Page_CurveTo(page_, x1, y1, x2, y2, x3, y3); i += 2; break; } case SegmentType::CubicC2: case SegmentType::CubicEnd: assert(false); case SegmentType::ArcC: { const double x = s.x(); const double y = s.y(); const double radius = segments[i+1].x(); double ang1 = segments[i+2].x(); double ang2 = ang1 + segments[i+2].y(); HPDF_Page_Arc(page_, x, y, radius, ang1 + 90, ang2 + 90); i += 2; break; } case SegmentType::ArcR: case SegmentType::ArcAngleSweep: assert(false); case SegmentType::QuadC: { const double x1 = s.x(); const double y1 = s.y(); const double x2 = segments[i+1].x(); const double y2 = segments[i+1].y(); // or CurveTo3 ?? Are these any different ?? HPDF_Page_CurveTo2(page_, x1, y1, x2, y2); i += 1; break; } case SegmentType::QuadEnd: assert(false); } } }