Пример #1
0
void k2pdfopt_reflow_bmp(KOPTContext *kctx,WILLUSBITMAP *src,int init)

    {
    static K2PDFOPT_SETTINGS _k2settings, *k2settings;
    static MASTERINFO _masterinfo, *masterinfo;
    WILLUSBITMAP _srcgrey, *srcgrey;
    BMPREGION region;
    static int pages_done=0;

    srcgrey=&_srcgrey;
    bmp_init(srcgrey);

    k2settings=&_k2settings;
    masterinfo=&_masterinfo;
    /* First call or new document call should use init =  1 */
    if (init==1)
        {
        /* Initialize settings */
        k2pdfopt_settings_init_from_koptcontext(k2settings,kctx);
        k2pdfopt_settings_sanity_check(k2settings);

        /* Init master output structure */
        masterinfo_init(masterinfo,k2settings);

        /* Init for new source doc */
        k2pdfopt_settings_new_source_document_init(k2settings);
        }

    /* Init new source bitmap */
    bmpregion_init(&region);
    masterinfo_new_source_page_init(masterinfo,k2settings,src,srcgrey,NULL,&region,0.,NULL,NULL,1,NULL);

    /* Process single source page */
    if (init)
        pages_done=0;
    bmpregion_source_page_add(&region,k2settings,masterinfo,1,pages_done++);
    bmp_free(srcgrey);

    /*
    ** Get output pages
    */ 
    {
    WILLUSBITMAP *bmp,_bmp;
    int rows,size_reduction;
    double bmpdpi;

    bmp=&_bmp;
    bmp_init(bmp);
    while ((rows=masterinfo_get_next_output_page(masterinfo,k2settings,1,bmp,
                                                 &bmpdpi,&size_reduction,NULL))>0)
        {
        /* Process output page stored in "bmp" */
        }
    bmp_free(bmp);
    }

    /* Final call should use init = -999 */
    if (init == -999)
        masterinfo_free(masterinfo,k2settings);
    }
Пример #2
0
void k2pdfopt_crop_bmp(KOPTContext *kctx) {
	static char *funcname="k2pdfopt_crop_bmp";
	K2PDFOPT_SETTINGS _k2settings, *k2settings;
	MASTERINFO _masterinfo, *masterinfo;
	WILLUSBITMAP _srcgrey, *srcgrey;
	WILLUSBITMAP *src;
	BMPREGION _region, *region;
	int *colcount,*rowcount;
	int i,j;
	float margin;

	src = &kctx->src;
	srcgrey = &_srcgrey;
	bmp_init(srcgrey);

	k2settings = &_k2settings;
	masterinfo = &_masterinfo;
	/* Initialize settings */
	k2pdfopt_settings_init_from_koptcontext(k2settings, kctx);
	k2pdfopt_settings_sanity_check(k2settings);
	/* Init master output structure */
	masterinfo_init(masterinfo, k2settings);
	bmp_init(&masterinfo->bmp);
	masterinfo->bmp.width = 0;
	masterinfo->bmp.height = 0;
	//wrapbmp_free(&masterinfo->wrapbmp);
	//wrapbmp_init(&masterinfo->wrapbmp, k2settings->dst_color);
	/* Init new source bitmap */
	region = &_region;
	bmpregion_init(region);
	masterinfo_new_source_page_init(masterinfo, k2settings, src, srcgrey, NULL,
			region, k2settings->src_rot, NULL, NULL, 1, NULL);
	printf("source page (%d,%d) - (%d,%d)\n",region->c1,region->r1,region->c2,region->r2);
	printf("source page bgcolor %d\n", region->bgcolor);
	bmpregion_trim_margins(region,k2settings,0xf);
	margin = kctx->margin*k2settings->dst_dpi;
	/*
	 * Suppose when page is zoomed to k level at fit to content width zoom mode,
	 * the content width is a, the device screen width is w,
	 * and the request margin size is m, x pixels are added as page margin.
	 * Then the following equations should be satisified:
	 * 1. k*(a + 2x) = w
	 * 2. 2*x*k = m
	 * which should be solved to x = m*a/(w-m)/2
	*/
	margin = margin*(region->c2 - region->c1)/(kctx->dev_width - margin)/2;

	kctx->bbox.x0 = (float)region->c1 - margin;
	kctx->bbox.y0 = (float)region->r1 - margin;
	kctx->bbox.x1 = (float)region->c2 + margin;
	kctx->bbox.y1 = (float)region->r2 + margin;

	bmp_free(src);
	bmp_free(srcgrey);
	bmpregion_free(region);
	masterinfo_free(masterinfo,k2settings);
}
Пример #3
0
void k2pdfopt_crop_bmp(KOPTContext *kctx) {
	static char *funcname="k2pdfopt_crop_bmp";
	K2PDFOPT_SETTINGS _k2settings, *k2settings;
	MASTERINFO _masterinfo, *masterinfo;
	WILLUSBITMAP _srcgrey, *srcgrey;
	WILLUSBITMAP *src;
	BMPREGION _region, *region;
	int *colcount,*rowcount;
	int i,j;
	float margin;

	src = &kctx->src;
	srcgrey = &_srcgrey;
	bmp_init(srcgrey);

	k2settings = &_k2settings;
	masterinfo = &_masterinfo;
	/* Initialize settings */
	k2pdfopt_settings_init_from_koptcontext(k2settings, kctx);
	k2pdfopt_settings_sanity_check(k2settings);
	/* Init master output structure */
	masterinfo_init(masterinfo, k2settings);
	bmp_init(&masterinfo->bmp);
	masterinfo->bmp.width = 0;
	masterinfo->bmp.height = 0;
	//wrapbmp_free(&masterinfo->wrapbmp);
	//wrapbmp_init(&masterinfo->wrapbmp, k2settings->dst_color);
	/* Init new source bitmap */
	region = &_region;
	bmpregion_init(region);
	masterinfo_new_source_page_init(masterinfo, k2settings, src, srcgrey, NULL,
			region, k2settings->src_rot, NULL, NULL, 1, NULL);
	printf("source page (%d,%d) - (%d,%d)\n",region->c1,region->r1,region->c2,region->r2);
	printf("source page bgcolor %d\n", region->bgcolor);
	bmpregion_trim_margins(region,k2settings,0xf);
	margin = k2settings->dst_mar*k2settings->dst_dpi+.5;
	kctx->bbox.x0 = (float)region->c1 - margin;
	kctx->bbox.y0 = (float)region->r1 - margin;
	kctx->bbox.x1 = (float)region->c2 + margin;
	kctx->bbox.y1 = (float)region->r2 + margin;

	bmp_free(src);
	bmp_free(srcgrey);
	bmpregion_free(region);
	masterinfo_free(masterinfo,k2settings);
}
Пример #4
0
void k2pdfopt_reflow_bmp(KOPTContext *kctx) {
    K2PDFOPT_SETTINGS _k2settings, *k2settings;
    MASTERINFO _masterinfo, *masterinfo;
    WILLUSBITMAP _srcgrey, *srcgrey;
    WILLUSBITMAP *src, *dst;
    BMPREGION region;
    int i, bw, marbot, marleft;

    src = &kctx->src;
    srcgrey = &_srcgrey;
    bmp_init(srcgrey);

    k2settings = &_k2settings;
    masterinfo = &_masterinfo;
    /* Initialize settings */
    k2pdfopt_settings_init_from_koptcontext(k2settings, kctx);
    k2pdfopt_settings_quick_sanity_check(k2settings);
    /* Init for new source doc */
    k2pdfopt_settings_new_source_document_init(k2settings);
    /* Init master output structure */
    masterinfo_init(masterinfo, k2settings);
    wrapbmp_init(&masterinfo->wrapbmp, k2settings->dst_color);
    /* Init new source bitmap */
    bmpregion_init(&region);
    masterinfo_new_source_page_init(masterinfo, k2settings, src, srcgrey, NULL,
            &region, k2settings->src_rot, NULL, NULL, 1, -1, NULL );
    /* Set output size */
    k2pdfopt_settings_set_margins_and_devsize(k2settings,&region,masterinfo,-1.,0);
    /* Process single source page */
    bmpregion_source_page_add(&region, k2settings, masterinfo, 1, 0);
    wrapbmp_flush(masterinfo, k2settings, 0);

    if (fabs(k2settings->dst_gamma - 1.0) > .001)
        bmp_gamma_correct(&masterinfo->bmp, &masterinfo->bmp,
                k2settings->dst_gamma);

    /* copy master bitmap to context dst bitmap */
    dst = &kctx->dst;
    marbot = (int) (k2settings->dst_dpi * k2settings->dstmargins.box[1] + .5);
    marleft = (int) (k2settings->dst_dpi * k2settings->dstmargins.box[0] + .5);
    dst->bpp = masterinfo->bmp.bpp;
    dst->width = masterinfo->bmp.width;
    dst->height = masterinfo->rows > kctx->page_height ? masterinfo->rows + marbot : kctx->page_height;
    bmp_alloc(dst);
    bmp_fill(dst, 255, 255, 255);
    bw = bmp_bytewidth(&masterinfo->bmp);
    for (i = 0; i < masterinfo->rows; i++)
        memcpy(bmp_rowptr_from_top(dst, i),
                bmp_rowptr_from_top(&masterinfo->bmp, i), bw);

    kctx->page_width = kctx->dst.width;
    kctx->page_height = kctx->dst.height;
    kctx->precache = 0;

    int j;
    BOXA *rboxa = boxaCreate(masterinfo->rectmaps.n);
    BOXA *nboxa = boxaCreate(masterinfo->rectmaps.n);
    for (j = 0; j < masterinfo->rectmaps.n; j++) {
        WRECTMAP * rectmap = &masterinfo->rectmaps.wrectmap[j];
        rectmap->coords[1].x += marleft;
        BOX* rlbox = boxCreate(rectmap->coords[1].x,
                              rectmap->coords[1].y,
                              rectmap->coords[2].x,
                              rectmap->coords[2].y);
        BOX* nlbox = boxCreate(rectmap->coords[0].x*k2settings->src_dpi/rectmap->srcdpiw/kctx->zoom + kctx->bbox.x0,
                              rectmap->coords[0].y*k2settings->src_dpi/rectmap->srcdpih/kctx->zoom + kctx->bbox.y0,
                              rectmap->coords[2].x*k2settings->src_dpi/rectmap->srcdpiw/kctx->zoom,
                              rectmap->coords[2].y*k2settings->src_dpi/rectmap->srcdpih/kctx->zoom);
        boxaAddBox(rboxa, rlbox, L_INSERT);
        boxaAddBox(nboxa, nlbox, L_INSERT);
        wrectmaps_add_wrectmap(&kctx->rectmaps, rectmap);

        /*printf("rectmap:coords:\t%.1f %.1f\t%.1f %.1f\t%.1f %.1f\t%.1f %.1f\n",
                rectmap->coords[0].x, rectmap->coords[0].y,
                rectmap->coords[1].x, rectmap->coords[1].y,
                rectmap->coords[2].x, rectmap->coords[2].y,
                rectmap->srcdpiw,     rectmap->srcdpih);*/
    }
    /* 2D sort the bounding boxes of these words. */
    BOXAA *rbaa = boxaSort2d(rboxa, NULL, 3, -5, 5);
    BOXAA *nbaa = boxaSort2d(nboxa, NULL, 3, -5, 5);

    /* Flatten the boxaa, saving the boxa index for each box */
    kctx->rboxa = boxaaFlattenToBoxa(rbaa, &kctx->rnai, L_CLONE);
    kctx->nboxa = boxaaFlattenToBoxa(nbaa, &kctx->nnai, L_CLONE);

    boxaDestroy(&rboxa);
    boxaaDestroy(&rbaa);
    boxaDestroy(&nboxa);
    boxaaDestroy(&nbaa);

    bmp_free(src);
    bmp_free(srcgrey);
    bmpregion_free(&region);
    masterinfo_free(masterinfo, k2settings);
}