58 printf(
"ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no, (HPDF_UINT)detail_no);
62 GpencilExporterPDF::GpencilExporterPDF(
const char *filename,
const GpencilIOParams *iparams)
76 return create_document();
86 export_gpencil_layers();
108 return (res == 0) ? true :
false;
112 bool GpencilExporterPDF::create_document()
116 std::cout <<
"error: cannot create PdfDoc object\n";
123 bool GpencilExporterPDF::add_page()
126 page_ = HPDF_AddPage(pdf_);
128 std::cout <<
"error: cannot create PdfPage\n";
139 void GpencilExporterPDF::export_gpencil_layers()
160 if ((gpf ==
nullptr) || (gpf->
strokes.
first ==
nullptr)) {
165 if (gps->totpoints < 2) {
173 const float fill_opacity =
fill_color_[3] * gpl->opacity;
188 if ((!is_stroke) && (!is_fill)) {
196 gps_duplicate->
thickness += gpl->line_change;
203 export_stroke_to_polyline(gpl, gps_duplicate, is_stroke,
true,
false);
209 export_stroke_to_polyline(gpl, gps_duplicate, is_stroke,
false,
true);
220 export_stroke_to_polyline(gpl, gps_perimeter, is_stroke,
false,
false);
235 void GpencilExporterPDF::export_stroke_to_polyline(
bGPDlayer *gpl,
237 const bool is_stroke,
257 color_set(gpl, do_fill);
259 if (is_stroke && !do_fill) {
260 HPDF_Page_SetLineJoin(page_, HPDF_ROUND_JOIN);
261 HPDF_Page_SetLineWidth(page_,
MAX2((radius * 2.0f) - gpl->
line_change, 1.0f));
265 for (
const int i : IndexRange(gps->
totpoints)) {
269 HPDF_Page_MoveTo(page_, screen_co.
x, screen_co.
y);
272 HPDF_Page_LineTo(page_, screen_co.
x, screen_co.
y);
277 HPDF_Page_ClosePath(page_);
281 HPDF_Page_Fill(page_);
284 HPDF_Page_Stroke(page_);
287 HPDF_Page_GRestore(page_);
294 void GpencilExporterPDF::color_set(
bGPDlayer *gpl,
const bool do_fill)
298 const bool need_state = (do_fill && fill_opacity < 1.0f) || (stroke_opacity < 1.0f);
300 HPDF_Page_GSave(page_);
301 HPDF_ExtGState gstate = (need_state) ? HPDF_CreateExtGState(pdf_) :
nullptr;
308 HPDF_Page_SetRGBFill(page_,
col[0],
col[1],
col[2]);
310 HPDF_ExtGState_SetAlphaFill(gstate,
clamp_f(fill_opacity, 0.0f, 1.0f));
318 HPDF_Page_SetRGBFill(page_,
col[0],
col[1],
col[2]);
319 HPDF_Page_SetRGBStroke(page_,
col[0],
col[1],
col[2]);
321 HPDF_ExtGState_SetAlphaFill(gstate,
clamp_f(stroke_opacity, 0.0f, 1.0f));
322 HPDF_ExtGState_SetAlphaStroke(gstate,
clamp_f(stroke_opacity, 0.0f, 1.0f));
326 HPDF_Page_SetExtGState(page_, gstate);
#define GPENCIL_ALPHA_OPACITY_THRESH
void BKE_gpencil_free_stroke(struct bGPDstroke *gps)
struct bGPDstroke * BKE_gpencil_stroke_duplicate(struct bGPDstroke *gps_src, const bool dup_points, const bool dup_curve)
float BKE_gpencil_stroke_average_pressure_get(struct bGPDstroke *gps)
bool BKE_gpencil_stroke_sample(struct bGPdata *gpd, struct bGPDstroke *gps, const float dist, const bool select)
struct bGPDstroke * BKE_gpencil_stroke_perimeter_from_view(struct RegionView3D *rv3d, struct bGPdata *gpd, const struct bGPDlayer *gpl, struct bGPDstroke *gps, const int subdivisions, const float diff_mat[4][4])
General operations, lookup, etc. for materials.
struct MaterialGPencilStyle * BKE_gpencil_material_settings(struct Object *ob, short act)
#define LISTBASE_FOREACH(type, var, list)
MINLINE float clamp_f(float value, float min, float max)
MINLINE void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3])
float mat4_to_scale(const float M[4][4])
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], const float t)
MINLINE void copy_v3_v3(float r[3], const float a[3])
static struct error_handler_data error_handler
#define CLAMP3(vec, b, c)
struct ID * DEG_get_evaluated_id(const struct Depsgraph *depsgraph, struct ID *id)
@ GP_MATERIAL_STROKE_SHOW
Object is a sort of wrapper for general info.
float stroke_point_radius_get(struct bGPDlayer *gpl, struct bGPDstroke *gps)
blender::Vector< ObjectZ > ob_list_
struct Depsgraph * depsgraph_
void create_object_list()
struct RegionView3D * rv3d_
void prepare_stroke_export_colors(struct Object *ob, struct bGPDstroke *gps)
float2 gpencil_3D_point_to_2D(const float3 co)
void filename_set(const char *filename)
float stroke_average_opacity_get()
void prepare_layer_export_matrix(struct Object *ob, struct bGPDlayer *gpl)
@ GP_EXPORT_NORM_THICKNESS
bool ED_gpencil_stroke_material_visible(Object *ob, const bGPDstroke *gps)
void *(* MEM_callocN)(size_t len, const char *str)
ccl_device_inline float2 normalize(const float2 &a)