mirror of
				https://github.com/michaelrsweet/pdfio.git
				synced 2025-10-31 18:35:45 +01:00 
			
		
		
		
	Add "need_bottom" argument to keep the following block on the same page.
This commit is contained in:
		| @@ -238,7 +238,7 @@ static double	measure_cell(docdata_t *dd, mmd_t *cell, tablecol_t *col); | |||||||
| static mmd_t	*mmd_walk_next(mmd_t *top, mmd_t *node); | static mmd_t	*mmd_walk_next(mmd_t *top, mmd_t *node); | ||||||
| static void	new_page(docdata_t *dd); | static void	new_page(docdata_t *dd); | ||||||
| static ssize_t	output_cb(void *output_cbdata, const void *buffer, size_t bytes); | static ssize_t	output_cb(void *output_cbdata, const void *buffer, size_t bytes); | ||||||
| static void	render_line(docdata_t *dd, double margin_left, double margin_top, double lineheight, size_t num_frags, linefrag_t *frags); | static void	render_line(docdata_t *dd, double margin_left, double margin_top, double need_bottom, double lineheight, size_t num_frags, linefrag_t *frags); | ||||||
| static void	render_row(docdata_t *dd, size_t num_cols, tablecol_t *cols, tablerow_t *row); | static void	render_row(docdata_t *dd, size_t num_cols, tablecol_t *cols, tablerow_t *row); | ||||||
| static void	set_color(docdata_t *dd, doccolor_t color); | static void	set_color(docdata_t *dd, doccolor_t color); | ||||||
| static void	set_font(docdata_t *dd, docfont_t font, double fsize); | static void	set_font(docdata_t *dd, docfont_t font, double fsize); | ||||||
| @@ -540,6 +540,7 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
| 		wswidth,		// Width of whitespace | 		wswidth,		// Width of whitespace | ||||||
| 		margin_left,		// Left margin | 		margin_left,		// Left margin | ||||||
| 		margin_top,		// Top margin | 		margin_top,		// Top margin | ||||||
|  | 		need_bottom,		// Space needed after this block | ||||||
| 		height,			// Height of current fragment | 		height,			// Height of current fragment | ||||||
| 		lineheight;		// Height of current line | 		lineheight;		// Height of current line | ||||||
|  |  | ||||||
| @@ -551,6 +552,11 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
|   else |   else | ||||||
|     margin_top = fsize * LINE_HEIGHT; |     margin_top = fsize * LINE_HEIGHT; | ||||||
|  |  | ||||||
|  |   if (mmdGetNextSibling(block)) | ||||||
|  |     need_bottom = 3.0 * SIZE_BODY * LINE_HEIGHT; | ||||||
|  |   else | ||||||
|  |     need_bottom = 0.0; | ||||||
|  |  | ||||||
|   if (leader) |   if (leader) | ||||||
|   { |   { | ||||||
|     // Add leader text on first line... |     // Add leader text on first line... | ||||||
| @@ -620,7 +626,7 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
|       else |       else | ||||||
|         margin_left = 0.0; |         margin_left = 0.0; | ||||||
|  |  | ||||||
|       render_line(dd, margin_left, margin_top, lineheight, num_frags, frags); |       render_line(dd, margin_left, margin_top, need_bottom, lineheight, num_frags, frags); | ||||||
|  |  | ||||||
|       if (deffont == DOCFONT_ITALIC) |       if (deffont == DOCFONT_ITALIC) | ||||||
|       { |       { | ||||||
| @@ -639,6 +645,7 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
|       x           = left; |       x           = left; | ||||||
|       lineheight  = 0.0; |       lineheight  = 0.0; | ||||||
|       margin_top  = 0.0; |       margin_top  = 0.0; | ||||||
|  |       need_bottom = 0.0; | ||||||
|  |  | ||||||
|       continue; |       continue; | ||||||
|     } |     } | ||||||
| @@ -688,7 +695,7 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
|       else |       else | ||||||
|         margin_left = 0.0; |         margin_left = 0.0; | ||||||
|  |  | ||||||
|       render_line(dd, margin_left, margin_top, lineheight, num_frags, frags); |       render_line(dd, margin_left, margin_top, need_bottom, lineheight, num_frags, frags); | ||||||
|  |  | ||||||
|       if (deffont == DOCFONT_ITALIC) |       if (deffont == DOCFONT_ITALIC) | ||||||
|       { |       { | ||||||
| @@ -707,6 +714,7 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
|       x           = left; |       x           = left; | ||||||
|       lineheight  = 0.0; |       lineheight  = 0.0; | ||||||
|       margin_top  = 0.0; |       margin_top  = 0.0; | ||||||
|  |       need_bottom = 0.0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Add the current node to the fragment list |     // Add the current node to the fragment list | ||||||
| @@ -743,7 +751,7 @@ format_block(docdata_t  *dd,		// I - Document data | |||||||
|     else |     else | ||||||
|       margin_left = 0.0; |       margin_left = 0.0; | ||||||
|  |  | ||||||
|     render_line(dd, margin_left, margin_top, lineheight, num_frags, frags); |     render_line(dd, margin_left, margin_top, need_bottom, lineheight, num_frags, frags); | ||||||
|  |  | ||||||
|     if (deffont == DOCFONT_ITALIC) |     if (deffont == DOCFONT_ITALIC) | ||||||
|     { |     { | ||||||
| @@ -820,6 +828,7 @@ format_code(docdata_t *dd,		// I - Document data | |||||||
|  |  | ||||||
|   // End the current text block... |   // End the current text block... | ||||||
|   pdfioContentTextEnd(dd->st); |   pdfioContentTextEnd(dd->st); | ||||||
|  |   dd->y += lineheight; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -859,6 +868,11 @@ format_doc(docdata_t *dd,		// I - Document data | |||||||
|       default : |       default : | ||||||
|           break; |           break; | ||||||
|  |  | ||||||
|  |       case MMD_TYPE_THEMATIC_BREAK : | ||||||
|  |           // Force a page break | ||||||
|  |           dd->y = dd->art_box.y1; | ||||||
|  |           break; | ||||||
|  |  | ||||||
|       case MMD_TYPE_BLOCK_QUOTE : |       case MMD_TYPE_BLOCK_QUOTE : | ||||||
|           format_doc(dd, current, DOCFONT_ITALIC, left + 36.0, right - 36.0); |           format_doc(dd, current, DOCFONT_ITALIC, left + 36.0, right - 36.0); | ||||||
|           break; |           break; | ||||||
| @@ -1381,6 +1395,7 @@ static void | |||||||
| render_line(docdata_t  *dd,		// I - Document data | render_line(docdata_t  *dd,		// I - Document data | ||||||
|             double     margin_left,	// I - Left margin |             double     margin_left,	// I - Left margin | ||||||
|             double     margin_top,	// I - Top margin |             double     margin_top,	// I - Top margin | ||||||
|  |             double     need_bottom,	// I - How much space is needed after | ||||||
|             double     lineheight,	// I - Height of line |             double     lineheight,	// I - Height of line | ||||||
|             size_t     num_frags,	// I - Number of line fragments |             size_t     num_frags,	// I - Number of line fragments | ||||||
|             linefrag_t *frags)		// I - Line fragments |             linefrag_t *frags)		// I - Line fragments | ||||||
| @@ -1397,7 +1412,7 @@ render_line(docdata_t  *dd,		// I - Document data | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   dd->y -= margin_top + lineheight; |   dd->y -= margin_top + lineheight; | ||||||
|   if ((dd->y - (margin_top > 0.0 ? lineheight : 0.0)) < dd->art_box.y1) |   if ((dd->y - need_bottom) < dd->art_box.y1) | ||||||
|   { |   { | ||||||
|     new_page(dd); |     new_page(dd); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user