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(®ion); masterinfo_new_source_page_init(masterinfo,k2settings,src,srcgrey,NULL,®ion,0.,NULL,NULL,1,NULL); /* Process single source page */ if (init) pages_done=0; bmpregion_source_page_add(®ion,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); }
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); }
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); }
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(®ion); masterinfo_new_source_page_init(masterinfo, k2settings, src, srcgrey, NULL, ®ion, k2settings->src_rot, NULL, NULL, 1, -1, NULL ); /* Set output size */ k2pdfopt_settings_set_margins_and_devsize(k2settings,®ion,masterinfo,-1.,0); /* Process single source page */ bmpregion_source_page_add(®ion, 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(®ion); masterinfo_free(masterinfo, k2settings); }