/* ** src guaranteed to be 24-bit color */ void publish_marked_page(PDFFILE *mpdf,WILLUSBITMAP *src,int src_dpi) { int newdpi; WILLUSBITMAP *bmp,_bmp; #if (WILLUSDEBUGX & 9) static int count=1; char filename[256]; sprintf(filename,"outsrc%02d.png",count++); bmp_write(src,filename,stdout,100); #endif bmp=&_bmp; bmp_init(bmp); newdpi = src_dpi/2; bmp->width=src->width/2; bmp->height=src->height/2; bmp->bpp=24; bmp_alloc(bmp); bmp_resample_optimum_performance(bmp,src,(double)0.,(double)0., (double)src->width,(double)src->height, bmp->width,bmp->height); pdffile_add_bitmap(mpdf,bmp,newdpi,-1,1); bmp_free(bmp); }
/* ** Create antialiased icons since Windows fails to do this. ** ** This works for the standard way that I compile exe's, which is to include ** a single 72 x 72 icon with them. ** */ void win_icons_from_exe(void **iconr,void **smalliconr) { char fullname[512]; char basename[256]; char appname[256]; HICON icon,smallicon,icon72; int small_dx,small_dy,icon_dx,icon_dy; HINSTANCE hinst; hinst=(HINSTANCE)win_hinstance(); win_full_exe_name(fullname); wfile_basespec(basename,fullname); wfile_newext(appname,basename,""); icon_dx = GetSystemMetrics(SM_CXICON); icon_dy = GetSystemMetrics(SM_CYICON); icon = LoadImage(hinst,appname,IMAGE_ICON,icon_dx,icon_dy,0); small_dx = GetSystemMetrics(SM_CXSMICON); small_dy = GetSystemMetrics(SM_CYSMICON); smallicon = LoadImage(hinst,appname,IMAGE_ICON,small_dx,small_dy,0); icon72 = LoadImage(hinst,appname,IMAGE_ICON,72,72,0); /* Create anti-aliased icons since Windows doesn't(!) */ if (icon72) { WILLUSBITMAP *bmp,_bmp; WILLUSBITMAP *bmpsmall,_bmpsmall; WILLUSBITMAP *bmplarge,_bmplarge; bmp=&_bmp; bmp_init(bmp); bmp->width=72; bmp->height=72; bmp->bpp=24; bmp_alloc(bmp); bmp_from_icon(bmp,icon72); bmplarge=&_bmplarge; bmp_init(bmplarge); bmp_resample(bmplarge,bmp,0.,0.,72.,72.,icon_dx,icon_dy); (*iconr)=(void *)bmp_to_icon(bmplarge,icon); DestroyIcon(icon); bmpsmall=&_bmpsmall; bmp_init(bmpsmall); bmp_resample(bmpsmall,bmp,0.,0.,72.,72.,small_dx,small_dy); (*smalliconr)=(void *)bmp_to_icon(bmpsmall,smallicon); DestroyIcon(smallicon); bmp_free(bmpsmall); bmp_free(bmplarge); bmp_free(bmp); } else { (*iconr)=(void *)icon; (*smalliconr)=(void *)smallicon; } DestroyIcon(icon72); }
static void wrapbmp_hyphen_erase(WRAPBMP *wrapbmp,K2PDFOPT_SETTINGS *k2settings) { WILLUSBITMAP *bmp,_bmp; int bw,bpp,c0,c1,c2,i; if (wrapbmp->hyphen.ch<0) return; #if (WILLUSDEBUGX & 16) printf("@hyphen_erase, bmp=%d x %d x %d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,wrapbmp->bmp.bpp); printf(" ch=%d, c2=%d, r1=%d, r2=%d\n",wrapbmp->hyphen.ch,wrapbmp->hyphen.c2,wrapbmp->hyphen.r1,wrapbmp->hyphen.r2); #endif bmp=&_bmp; bmp_init(bmp); bmp->bpp = wrapbmp->bmp.bpp; if (bmp->bpp==8) for (i=0;i<256;i++) bmp->red[i]=bmp->blue[i]=bmp->green[i]=i; bmp->height = wrapbmp->bmp.height; if (k2settings->src_left_to_right) { bmp->width = wrapbmp->hyphen.c2+1; c0=0; c1=wrapbmp->hyphen.ch; c2=bmp->width-1; } else { bmp->width = wrapbmp->bmp.width - wrapbmp->hyphen.c2; c0=wrapbmp->hyphen.c2; c1=0; c2=wrapbmp->hyphen.ch-wrapbmp->hyphen.c2; } bmp_alloc(bmp); bpp=bmp->bpp==24 ? 3 : 1; bw=bpp*bmp->width; for (i=0;i<bmp->height;i++) memcpy(bmp_rowptr_from_top(bmp,i),bmp_rowptr_from_top(&wrapbmp->bmp,i)+bpp*c0,bw); bw=(c2-c1+1)*bpp; if (bw>0) for (i=wrapbmp->hyphen.r1;i<=wrapbmp->hyphen.r2;i++) memset(bmp_rowptr_from_top(bmp,i)+bpp*c1,255,bw); #if (WILLUSDEBUGX & 16) { static int count=1; char filename[256]; sprintf(filename,"be%04d.png",count); bmp_write(&wrapbmp->bmp,filename,stdout,100); sprintf(filename,"ae%04d.png",count); bmp_write(bmp,filename,stdout,100); count++; } #endif bmp_copy(&wrapbmp->bmp,bmp); bmp_free(bmp); }
static int getPagePix(lua_State *L) { DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage"); KOPTContext *kctx = (KOPTContext*) lua_topointer(L, 2); ddjvu_rect_t prect; ddjvu_rect_t rrect; int px, py, pw, ph, rx, ry, rw, rh, status; px = 0; py = 0; pw = ddjvu_page_get_width(page->page_ref); ph = ddjvu_page_get_height(page->page_ref); prect.x = px; prect.y = py; rx = (int)kctx->bbox.x0; ry = (int)kctx->bbox.y0; rw = (int)(kctx->bbox.x1 - kctx->bbox.x0); rh = (int)(kctx->bbox.y1 - kctx->bbox.y0); float scale = kctx->zoom; prect.w = pw * scale; prect.h = ph * scale; rrect.x = rx * scale; rrect.y = ry * scale; rrect.w = rw * scale; rrect.h = rh * scale; printf("rendering page:%d,%d,%d,%d\n",rrect.x,rrect.y,rrect.w,rrect.h); WILLUSBITMAP *dst = &kctx->src; bmp_init(dst); dst->width = rrect.w; dst->height = rrect.h; dst->bpp = 8; bmp_alloc(dst); if (dst->bpp == 8) { int ii; for (ii = 0; ii < 256; ii++) dst->red[ii] = dst->blue[ii] = dst->green[ii] = ii; } ddjvu_format_set_row_order(page->doc->pixelformat, 1); ddjvu_page_render(page->page_ref, 0, &prect, &rrect, page->doc->pixelformat, bmp_bytewidth(dst), (char *) dst->data); return 0; }
static int bmpmupdf_pixmap_to_bmp(WILLUSBITMAP *bmp,fz_context *ctx,fz_pixmap *pixmap) { unsigned char *p; int ncomp,i,row,col; bmp->width=fz_pixmap_width(ctx,pixmap); bmp->height=fz_pixmap_height(ctx,pixmap); ncomp=fz_pixmap_components(ctx,pixmap); /* Has to be 8-bit or RGB */ if (ncomp != 2 && ncomp != 4) return(-1); bmp->bpp=(ncomp==2) ? 8 : 24; bmp_alloc(bmp); if (ncomp==2) for (i=0;i<256;i++) bmp->red[i]=bmp->green[i]=bmp->blue[i]=i; p = fz_pixmap_samples(ctx,pixmap); if (ncomp==1) for (row=0;row<bmp->height;row++) { unsigned char *dest; dest=bmp_rowptr_from_top(bmp,row); memcpy(dest,p,bmp->width); p+=bmp->width; } else if (ncomp==2) for (row=0;row<bmp->height;row++) { unsigned char *dest; dest=bmp_rowptr_from_top(bmp,row); for (col=0;col<bmp->width;col++,dest++,p+=2) dest[0]=p[0]; } else for (row=0;row<bmp->height;row++) { unsigned char *dest; dest=bmp_rowptr_from_top(bmp,row); for (col=0;col<bmp->width;col++,dest+=ncomp-1,p+=ncomp) memcpy(dest,p,ncomp-1); } return(0); }
int win_clipboard_to_bmp(WILLUSBITMAP *bmp,FILE *out) { static char *funcname="win_clipboard_to_bmp"; HBITMAP hbitmap; HWND dtwin; HDC hDC,hMemDC; dtwin=GetDesktopWindow(); if (!OpenClipboard(dtwin)) { nprintf(out,"win_clipboard_to_bmp: Error opening clipboard.\n"); return(-1); } hbitmap=(HBITMAP)GetClipboardData(CF_BITMAP); if (hbitmap==NULL) { nprintf(out,"win_clipboard_to_bmp: Clipboard does not have a bitmap.\n"); CloseClipboard(); return(-2); } // This is kludgy, but works for 24-bit desktops hDC=GetDC(dtwin); if (hDC==NULL) { nprintf(out,"win_clipboard_to_bmp: Could not get DC.\n"); CloseClipboard(); return(-3); } // Create a device context for the windows bitmap hMemDC=CreateCompatibleDC(hDC); if (hMemDC==NULL) { nprintf(out,"win_clipboard_to_bmp: Could not create hMemDC.\n"); // DeleteObject(hbitmap); ReleaseDC(dtwin,hDC); return(-4); } // Select the windows bitmap into the new device context SelectObject(hMemDC,hbitmap); /* Kludgey way to get BMP dims, but GetBitmapDimensionsEx() doesn't work. */ { int step; for (step=2048,bmp->width=0;1;bmp->width+=step) { if (GetPixel(hMemDC,bmp->width,0)==CLR_INVALID) { if (step==1 || bmp->width==0) break; bmp->width -= step; step >>= 1; } } for (step=1024,bmp->height=0;1;bmp->height+=step) { if (GetPixel(hMemDC,0,bmp->height)==CLR_INVALID) { if (step==1 || bmp->height==0) break; bmp->height -= step; step >>= 1; } } } if (bmp->height==0 || bmp->width==0) { nprintf(out,"win_clipboard_to_bmp: Zero sized bitmap.\n"); DeleteDC(hMemDC); ReleaseDC(dtwin,hDC); return(-5); } bmp->bpp=24; bmp->type=WILLUSBITMAP_TYPE_WIN32; bmp_alloc(bmp); // Set up the device independent bitmap { BITMAPINFO *bmi; willus_mem_alloc_warn((void **)&bmi,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD),funcname,10); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biWidth = bmp->width; bmi->bmiHeader.biHeight = bmp->height; bmi->bmiHeader.biPlanes = 1; bmi->bmiHeader.biBitCount = 24; bmi->bmiHeader.biCompression = BI_RGB; bmi->bmiHeader.biSizeImage = 0; bmi->bmiHeader.biXPelsPerMeter = (int)(72.0*100./2.54); bmi->bmiHeader.biYPelsPerMeter = (int)(72.0*100./2.54); bmi->bmiHeader.biClrUsed = 0; bmi->bmiHeader.biClrImportant = 0; GetDIBits(hMemDC,hbitmap,0,bmp->height,bmp->data,bmi,DIB_RGB_COLORS); /* Old way--pretty slow */ /* for (row=0;row<bmp->height;row++) { unsigned char *p; int col; p=bmp_rowptr_from_top(bmp,row); for (col=0;col<bmp->width;col++,p+=3) { int x; x=(int)GetPixel(hMemDC,col,row); p[0]=x&0xff; p[1]=(x>>8)&0xff; p[2]=(x>>16)&0xff; } } */ willus_mem_free((double **)&bmi,funcname); } DeleteDC(hMemDC); ReleaseDC(dtwin,hDC); return(0); }
/* ** 24-bit only */ int win_emf_to_bmp(wmetafile *wmf,int dpi,WILLUSBITMAP *bmp,FILE *out) { HENHMETAFILE hemf; HWND h; ENHMETAHEADER header; double width_in,height_in,dpi_adjust; int width_pix,height_pix; int width_bytes; HDC hDC,hMemDC; RECT lprect; BITMAPINFO *bmi; static HBITMAP hBitmap=NULL; int planes,bpp; static char *funcname="win_emf_to_bmp"; hemf=(HENHMETAFILE)wmf; h=GetDesktopWindow(); GetEnhMetaFileHeader(hemf,sizeof(ENHMETAHEADER),&header); /* Set up bitmap dimensions */ width_in = (header.rclFrame.right-header.rclFrame.left)/2540.; height_in = (header.rclFrame.bottom-header.rclFrame.top)/2540.; dpi_adjust = header.rclFrame.left==0 ? 1.0 : (1.0/5.8); /* printf("h.rclframe.left=%g\n",header.rclFrame.left/2540.); printf("width_in = %g\n",width_in); printf("szlmm = %d\n",header.szlMillimeters); printf("szlpix = %d\n",header.szlDevice); printf("iType = %d\n",header.iType); printf("dSig = %d\n",header.dSignature); printf("nDesc = %d\n",header.nDescription); printf("nVer = %d\n",header.nVersion); printf("h.rclbounds.left=%d\n",header.rclBounds.left); printf("h.rclbounds.width=%d\n",header.rclBounds.right-header.rclBounds.left); */ width_pix = (int)(width_in*dpi*dpi_adjust); height_pix = (int)(height_in*dpi*dpi_adjust); width_bytes=width_pix; while (width_bytes&3) width_bytes++; lprect.left=0; lprect.right=width_pix-1; lprect.top=0; lprect.bottom=height_pix-1; /* ** Allocate bit map info structure (has to be allocated due to ** arbitrarily sized color palette ==> cannot be statically declared) */ if (!willus_mem_alloc((double **)&bmi,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD),funcname)) return(2); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // Get device context hDC=GetDC(h); if (hDC==NULL) { willus_mem_free((double **)&bmi,funcname); nprintf(out,"win_emf_to_bmp: Could not get DC.\n"); return(4); } planes=GetDeviceCaps(hDC,PLANES); bpp=GetDeviceCaps(hDC,BITSPIXEL); // Create a windows bitmap to play the metafile into hBitmap=CreateBitmap(width_pix,height_pix,planes,bpp,NULL); if (hBitmap==NULL) { ReleaseDC(h,hDC); willus_mem_free((double **)&bmi,funcname); return(5); } // Create a device context for the windows bitmap hMemDC=CreateCompatibleDC(hDC); if (hMemDC==NULL) { nprintf(out,"win_emf_to_bmp: Could not create hMemDC.\n"); DeleteObject(hBitmap); ReleaseDC(h,hDC); willus_mem_free((double **)&bmi,funcname); return(6); } // Select the windows bitmap into the new device context SelectObject(hMemDC,hBitmap); // Clear the windows bitmap PatBlt(hMemDC,0,0,width_pix,height_pix,WHITENESS); // White background // Play the metafile into it PlayEnhMetaFile(hMemDC,hemf,&lprect); bmp->bpp=24; bmp->width=width_pix; bmp->height=height_pix; bmp->type=WILLUSBITMAP_TYPE_WIN32; bmp_alloc(bmp); // Set up the device independent bitmap bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biWidth = width_pix; bmi->bmiHeader.biHeight = height_pix; bmi->bmiHeader.biPlanes = 1; bmi->bmiHeader.biBitCount = 24; bmi->bmiHeader.biCompression = BI_RGB; bmi->bmiHeader.biSizeImage = 0; bmi->bmiHeader.biXPelsPerMeter = (int)(dpi*100./2.54); bmi->bmiHeader.biYPelsPerMeter = (int)(dpi*100./2.54); bmi->bmiHeader.biClrUsed = 0; bmi->bmiHeader.biClrImportant = 0; // Get the bits from the windows bitmap into the DI bitmap GetDIBits(hMemDC,hBitmap,0,height_pix,bmp->data,bmi,DIB_RGB_COLORS); DeleteDC(hMemDC); DeleteObject(hBitmap); ReleaseDC(h,hDC); willus_mem_free((double **)&bmi,funcname); return(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(®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); }
void enable_bootsplash(void) { if (!CONFIG_BOOTSPLASH) return; /* splash picture can be bmp or jpeg file */ dprintf(3, "Checking for bootsplash\n"); u8 type = 0; /* 0 means jpg, 1 means bmp, default is 0=jpg */ int filesize; u8 *filedata = romfile_loadfile("bootsplash.jpg", &filesize); if (!filedata) { filedata = romfile_loadfile("bootsplash.bmp", &filesize); if (!filedata) return; type = 1; } dprintf(3, "start showing bootsplash\n"); u8 *picture = NULL; /* data buff used to be flushed to the video buf */ struct jpeg_decdata *jpeg = NULL; struct bmp_decdata *bmp = NULL; struct vbe_info *vesa_info = malloc_tmplow(sizeof(*vesa_info)); struct vbe_mode_info *mode_info = malloc_tmplow(sizeof(*mode_info)); if (!vesa_info || !mode_info) { warn_noalloc(); goto done; } /* Check whether we have a VESA 2.0 compliant BIOS */ memset(vesa_info, 0, sizeof(struct vbe_info)); vesa_info->signature = VBE2_SIGNATURE; struct bregs br; memset(&br, 0, sizeof(br)); br.ax = 0x4f00; br.di = FLATPTR_TO_OFFSET(vesa_info); br.es = FLATPTR_TO_SEG(vesa_info); call16_int10(&br); if (vesa_info->signature != VESA_SIGNATURE) { dprintf(1,"No VBE2 found.\n"); goto done; } /* Print some debugging information about our card. */ char *vendor = SEGOFF_TO_FLATPTR(vesa_info->oem_vendor_string); char *product = SEGOFF_TO_FLATPTR(vesa_info->oem_product_string); dprintf(3, "VESA %d.%d\nVENDOR: %s\nPRODUCT: %s\n", vesa_info->version>>8, vesa_info->version&0xff, vendor, product); int ret, width, height; int bpp_require = 0; if (type == 0) { jpeg = jpeg_alloc(); if (!jpeg) { warn_noalloc(); goto done; } /* Parse jpeg and get image size. */ dprintf(5, "Decoding bootsplash.jpg\n"); ret = jpeg_decode(jpeg, filedata); if (ret) { dprintf(1, "jpeg_decode failed with return code %d...\n", ret); goto done; } jpeg_get_size(jpeg, &width, &height); } else { bmp = bmp_alloc(); if (!bmp) { warn_noalloc(); goto done; } /* Parse bmp and get image size. */ dprintf(5, "Decoding bootsplash.bmp\n"); ret = bmp_decode(bmp, filedata, filesize); if (ret) { dprintf(1, "bmp_decode failed with return code %d...\n", ret); goto done; } bmp_get_size(bmp, &width, &height); bpp_require = 24; } /* jpeg would use 16 or 24 bpp video mode, BMP use 24bpp mode only */ // Try to find a graphics mode with the corresponding dimensions. int videomode = find_videomode(vesa_info, mode_info, width, height, bpp_require); if (videomode < 0) { dprintf(1, "failed to find a videomode with %dx%d %dbpp (0=any).\n", width, height, bpp_require); goto done; } void *framebuffer = (void *)mode_info->phys_base; int depth = mode_info->bits_per_pixel; dprintf(3, "mode: %04x\n", videomode); dprintf(3, "framebuffer: %p\n", framebuffer); dprintf(3, "bytes per scanline: %d\n", mode_info->bytes_per_scanline); dprintf(3, "bits per pixel: %d\n", depth); // Allocate space for image and decompress it. int imagesize = height * mode_info->bytes_per_scanline; picture = malloc_tmphigh(imagesize); if (!picture) { warn_noalloc(); goto done; } if (type == 0) { dprintf(5, "Decompressing bootsplash.jpg\n"); ret = jpeg_show(jpeg, picture, width, height, depth, mode_info->bytes_per_scanline); if (ret) { dprintf(1, "jpeg_show failed with return code %d...\n", ret); goto done; } } else { dprintf(5, "Decompressing bootsplash.bmp\n"); ret = bmp_show(bmp, picture, width, height, depth, mode_info->bytes_per_scanline); if (ret) { dprintf(1, "bmp_show failed with return code %d...\n", ret); goto done; } } /* Switch to graphics mode */ dprintf(5, "Switching to graphics mode\n"); memset(&br, 0, sizeof(br)); br.ax = 0x4f02; br.bx = videomode | VBE_MODE_LINEAR_FRAME_BUFFER; call16_int10(&br); if (br.ax != 0x4f) { dprintf(1, "set_mode failed.\n"); goto done; } /* Show the picture */ dprintf(5, "Showing bootsplash picture\n"); iomemcpy(framebuffer, picture, imagesize); dprintf(5, "Bootsplash copy complete\n"); BootsplashActive = 1; done: free(filedata); free(picture); free(vesa_info); free(mode_info); free(jpeg); free(bmp); return; }
// static int bcount=0; void wrapbmp_add(WRAPBMP *wrapbmp,BMPREGION *region,K2PDFOPT_SETTINGS *k2settings, MASTERINFO *masterinfo,int colgap,int just_flags) { WILLUSBITMAP *tmp,_tmp; int i,rh,th,bw,new_base,h2,bpp,width0; // static char filename[256]; #if (WILLUSDEBUGX & 205) k2printf("@wrapbmp->add %d x %d (w=%d).\n",region->c2-region->c1+1,region->r2-region->r1+1,wrapbmp->bmp.width); printf(" line_spacing=%d\n",region->bbox.rowheight); #endif /* Figure out if what we're adding ends in a hyphen */ bmpregion_hyphen_detect(region,k2settings->hyphen_detect,k2settings->src_left_to_right); if (wrapbmp_ends_in_hyphen(wrapbmp)) colgap=0; wrapbmp_hyphen_erase(wrapbmp,k2settings); wrapbmp->just_flushed_internal=0; // Reset "just flushed" flag if (wrapbmp->bmp.width==0) wrapbmp->textrow=region->bbox; else { if (region->bbox.rowheight > wrapbmp->textrow.rowheight) wrapbmp->textrow.rowheight = region->bbox.rowheight; if (region->bbox.gap > wrapbmp->textrow.gap) wrapbmp->textrow.gap = region->bbox.gap; if (region->bbox.gapblank > wrapbmp->textrow.gapblank) wrapbmp->textrow.gapblank = region->bbox.gapblank; } wrapbmp->bgcolor=region->bgcolor; wrapbmp->just=just_flags; if (wrapbmp->mandatory_region_gap<0) { wrapbmp->mandatory_region_gap=masterinfo->mandatory_region_gap; wrapbmp->page_region_gap_in=masterinfo->page_region_gap_in; masterinfo->mandatory_region_gap=0; masterinfo->page_region_gap_in=-1.; #if (WILLUSDEBUGX & 0x200) aprintf(ANSI_RED "mi->mandatory_region_gap change to %d by wrap_add." ANSI_NORMAL "\n",masterinfo->mandatory_region_gap); #endif } #if (WILLUSDEBUGX & 4) k2printf(" c1=%d, c2=%d, r1=%d, r2=%d\n",region->c1,region->c2,region->r1,region->r2); k2printf(" colgap=%d, line_spacing=%d, rowbase=%d, row gap=%d\n",colgap,region->bbox.rowheight,region->bbox.rowbase,region->bbox.gap); #endif bpp=k2settings->dst_color?3:1; rh=region->bbox.rowbase-region->r1+1; if (rh > wrapbmp->rhmax) wrapbmp->rhmax=rh; th = rh + (region->r2-region->bbox.rowbase); if (th > wrapbmp->thmax) wrapbmp->thmax=th; #if (WILLUSDEBUGX & 4) { static int bcount=0; char filename[256]; sprintf(filename,"out%05d.png",bcount++); bmpregion_write(region,filename); } #endif if (wrapbmp->bmp.width==0) { /* Put appropriate gap in */ /* if (k2settings->last_rowbase_internal>=0 && rh < wrapbmp->textrow.rowheight-k2settings->last_rowbase_internal) { rh = wrapbmp->textrow.rowheight - k2settings->last_rowbase_internal; if (rh<2) rh=2; th = rh + (region->r2-region->bbox.rowbase); wrapbmp->height_extended=0; } else wrapbmp->height_extended=(k2settings->last_rowbase_internal>=0); */ wrapbmp->base = rh-1; wrapbmp->bmp.height = th; #if (WILLUSDEBUGX & 4) k2printf(" bmpheight set to %d (line spacing=%d)\n",wrapbmp->bmp.height,wrapbmp->textrow.rowheight); #endif wrapbmp->bmp.width=region->c2-region->c1+1; bmp_alloc(&wrapbmp->bmp); bw=bmp_bytewidth(&wrapbmp->bmp); memset(bmp_rowptr_from_top(&wrapbmp->bmp,0),255,bw*wrapbmp->bmp.height); for (i=region->r1;i<=region->r2;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(&wrapbmp->bmp,wrapbmp->base+(i-region->bbox.rowbase)); s=bmp_rowptr_from_top(k2settings->dst_color?region->bmp:region->bmp8,i)+bpp*region->c1; memcpy(d,s,bw); } #ifdef WILLUSDEBUG if (wrapbmp->bmp.height<=wrapbmp->base) { k2printf("1. SCREEECH!\n"); k2printf("wrapbmp = %d x %d, base=%d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,wrapbmp->base); exit(10); } #endif /* Copy hyphen info from added region */ wrapbmp->hyphen = region->bbox.hyphen; if (wrapbmp_ends_in_hyphen(wrapbmp)) { wrapbmp->hyphen.r1 += (wrapbmp->base-region->bbox.rowbase); wrapbmp->hyphen.r2 += (wrapbmp->base-region->bbox.rowbase); wrapbmp->hyphen.ch -= region->c1; wrapbmp->hyphen.c2 -= region->c1; } /* Map to source page */ { WRECTMAP _wrmap,*wrmap; wrmap=&_wrmap; wrmap->srcpageno = region->pageno; wrmap->srcwidth = region->bmp8->width; wrmap->srcheight = region->bmp8->height; wrmap->srcdpiw = wrmap->srcdpih = region->dpi; wrmap->srcrot = region->rotdeg; wrmap->coords[0].x = region->c1; wrmap->coords[0].y = region->r1; wrmap->coords[1].x = 0; wrmap->coords[1].y = wrapbmp->base+(region->r1-region->bbox.rowbase); wrmap->coords[2].x = region->c2-region->c1+1; wrmap->coords[2].y = region->r2-region->r1+1; #if (WILLUSDEBUGX & 0x400) printf("@wrapbmp: (x0,y0) = (%5.1f,%5.1f)\n",region->c1*72./region->dpi,region->r1*72./region->dpi); printf(" %5.1f x %5.1f\n",(region->c2-region->c1+1)*72./region->dpi,(region->r2-region->r1+1)*72./region->dpi); printf(" New bitmap = %d x %d\n",wrapbmp->bmp.width,wrapbmp->bmp.height); #endif wrectmaps_add_wrectmap(&wrapbmp->wrectmaps,wrmap); } return; } width0=wrapbmp->bmp.width; /* Starting wrapbmp width */ tmp=&_tmp; bmp_init(tmp); bmp_copy(tmp,&wrapbmp->bmp); tmp->width += colgap+region->c2-region->c1+1; if (rh > wrapbmp->base) { /* wrapbmp->height_extended=1; */ new_base = rh-1; } else new_base = wrapbmp->base; if (region->r2-region->bbox.rowbase > wrapbmp->bmp.height-1-wrapbmp->base) h2=region->r2-region->bbox.rowbase; else h2=wrapbmp->bmp.height-1-wrapbmp->base; tmp->height = new_base + h2 + 1; bmp_alloc(tmp); bw=bmp_bytewidth(tmp); memset(bmp_rowptr_from_top(tmp,0),255,bw*tmp->height); bw=bmp_bytewidth(&wrapbmp->bmp); #if (WILLUSDEBUGX & 4) k2printf("3. wbh=%d x %d, tmp=%d x %d x %d, new_base=%d, wbbase=%d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,tmp->width,tmp->height,tmp->bpp,new_base,wrapbmp->base); #endif /* Adjust previous mappings to source pages since WRAPBMP rectangle has been re-sized */ if (new_base!=wrapbmp->base) for (i=0;i<wrapbmp->wrectmaps.n;i++) { wrapbmp->wrectmaps.wrectmap[i].coords[1].y += (new_base-wrapbmp->base); if (k2settings->src_left_to_right==0) wrapbmp->wrectmaps.wrectmap[i].coords[1].x += tmp->width-1-wrapbmp->bmp.width; } for (i=0;i<wrapbmp->bmp.height;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(tmp,i+new_base-wrapbmp->base) + (k2settings->src_left_to_right ? 0 : tmp->width-1-wrapbmp->bmp.width)*bpp; s=bmp_rowptr_from_top(&wrapbmp->bmp,i); memcpy(d,s,bw); } bw=bpp*(region->c2-region->c1+1); if (region->r1+new_base-region->bbox.rowbase<0 || region->r2+new_base-region->bbox.rowbase>tmp->height-1) { k2printf(ANSI_YELLOW "INTERNAL ERROR--TMP NOT DIMENSIONED PROPERLY.\n"); k2printf("(%d-%d), tmp->height=%d\n" ANSI_NORMAL, region->r1+new_base-region->bbox.rowbase, region->r2+new_base-region->bbox.rowbase,tmp->height); exit(10); } for (i=region->r1;i<=region->r2;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(tmp,i+new_base-region->bbox.rowbase) + (k2settings->src_left_to_right ? wrapbmp->bmp.width+colgap : 0)*bpp; s=bmp_rowptr_from_top(k2settings->dst_color?region->bmp:region->bmp8,i)+bpp*region->c1; memcpy(d,s,bw); } { WRECTMAP _wrmap,*wrmap; wrmap=&_wrmap; wrmap->srcpageno = region->pageno; wrmap->srcwidth = region->bmp8->width; wrmap->srcheight = region->bmp8->height; wrmap->srcdpiw = wrmap->srcdpih = region->dpi; wrmap->srcrot = region->rotdeg; wrmap->coords[0].x = region->c1; wrmap->coords[0].y = region->r1; wrmap->coords[1].x = k2settings->src_left_to_right ? wrapbmp->bmp.width+colgap : 0; wrmap->coords[1].y = region->r1+new_base-region->bbox.rowbase; wrmap->coords[2].x = region->c2-region->c1+1; wrmap->coords[2].y = region->r2-region->r1+1; #if (WILLUSDEBUGX & 0x400) printf("@wrapbmp: (x0,y0) = (%5.1f,%5.1f)\n",region->c1*72./region->dpi,region->r1*72./region->dpi); printf(" org bmp = %d x %d\n",wrapbmp->bmp.width,wrapbmp->bmp.height); printf(" new_base=%d, r_base=%d\n",new_base,region->bbox.rowbase); printf(" (x1,y1) = (%g,%g)\n",wrmap->coords[1].x,wrmap->coords[1].y); printf(" %5.1f x %5.1f\n",(region->c2-region->c1+1)*72./region->dpi,(region->r2-region->r1+1)*72./region->dpi); printf(" New bitmap = %d x %d\n",tmp->width,tmp->height); #endif wrectmaps_add_wrectmap(&wrapbmp->wrectmaps,wrmap); } bmp_copy(&wrapbmp->bmp,tmp); #if (WILLUSDEBUGX & 4) { static int rcount=0; char filename[256]; sprintf(filename,"result%03d.png",rcount++); bmp_write(tmp,filename,stdout,100); } #endif bmp_free(tmp); /* Copy region's hyphen info */ wrapbmp->hyphen = region->bbox.hyphen; if (wrapbmp_ends_in_hyphen(wrapbmp)) { wrapbmp->hyphen.r1 += (new_base-region->bbox.rowbase); wrapbmp->hyphen.r2 += (new_base-region->bbox.rowbase); if (k2settings->src_left_to_right) { wrapbmp->hyphen.ch += width0+colgap-region->c1; wrapbmp->hyphen.c2 += width0+colgap-region->c1; } else { wrapbmp->hyphen.ch -= region->c1; wrapbmp->hyphen.c2 -= region->c1; } } wrapbmp->base=new_base; /* Doesn't seem to work? v2.00 */ /* wrapbmp->textrow.gap = (wrapbmp->bmp.height-1)-new_base; wrapbmp->textrow.gapblank = 0; */ #ifdef WILLUSDEBUG if (wrapbmp->bmp.height<=wrapbmp->base) { k2printf("2. SCREEECH!\n"); k2printf("wrapbmp = %d x %d, base=%d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,wrapbmp->base); exit(10); } #endif }
// static int bcount=0; void wrapbmp_add(WRAPBMP *wrapbmp,BMPREGION *region,K2PDFOPT_SETTINGS *k2settings, int gap,int line_spacing,int rbase,int gio,int just_flags) { WILLUSBITMAP *tmp,_tmp; int i,rh,th,bw,new_base,h2,bpp,width0; // static char filename[256]; #ifdef WILLUSDEBUG printf("@wrapbmp->add %d x %d (w=%d).\n",region->c2-region->c1+1,region->r2-region->r1+1,wrapbmp->bmp.width); #endif /* Figure out if what we're adding ends in a hyphen */ bmpregion_hyphen_detect(region,k2settings->hyphen_detect,k2settings->src_left_to_right); if (wrapbmp_ends_in_hyphen(wrapbmp)) gap=0; wrapbmp_hyphen_erase(wrapbmp,k2settings); wrapbmp->just_flushed_internal=0; // Reset "just flushed" flag wrapbmp->beginning_gap_internal = -1; // Reset top-of-page or top-of-column gap wrapbmp->last_h5050_internal = -1; // Reset last row font size if (line_spacing > wrapbmp->line_spacing) wrapbmp->line_spacing = line_spacing; if (gio > wrapbmp->gap) wrapbmp->gap = gio; wrapbmp->bgcolor=region->bgcolor; wrapbmp->just=just_flags; /* printf(" c1=%d, c2=%d, r1=%d, r2=%d\n",region->c1,region->c2,region->r1,region->r2); printf(" gap=%d, line_spacing=%d, rbase=%d, gio=%d\n",gap,line_spacing,rbase,gio); */ bpp=k2settings->dst_color?3:1; rh=rbase-region->r1+1; if (rh > wrapbmp->rhmax) wrapbmp->rhmax=rh; th = rh + (region->r2-rbase); if (th > wrapbmp->thmax) wrapbmp->thmax=th; /* { WILLUSBITMAP *bmp,_bmp; bmp=&_bmp; bmp_init(bmp); bmp->height=region->r2-region->r1+1; bmp->width=region->c2-region->c1+1; bmp->bpp=bpp*8; if (bpp==1) for (i=0;i<256;i++) bmp->red[i]=bmp->blue[i]=bmp->green[i]=i; bmp_alloc(&wrapbmp->bmp); bw=bmp_bytewidth(&wrapbmp->bmp); memset(bmp_rowptr_from_top(bmp,0),255,bw*bmp->height); for (i=region->r1;i<=region->r2;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(bmp,i-region->r1); s=bmp_rowptr_from_top(k2settings->dst_color?region->bmp:region->bmp8,i)+bpp*region->c1; if (i==rbase) memset(d,0,bw); else memcpy(d,s,bw); } sprintf(filename,"out%05d.png",bcount++); bmp_write(bmp,filename,stdout,100); bmp_free(bmp); } */ if (wrapbmp->bmp.width==0) { /* Put appropriate gap in */ if (k2settings->last_rowbase_internal>=0 && rh < wrapbmp->line_spacing-k2settings->last_rowbase_internal) { rh = wrapbmp->line_spacing - k2settings->last_rowbase_internal; if (rh<2) rh=2; th = rh + (region->r2-rbase); wrapbmp->height_extended=0; } else wrapbmp->height_extended=(k2settings->last_rowbase_internal>=0); wrapbmp->base = rh-1; wrapbmp->bmp.height = th; #ifdef WILLUSDEBUG printf("@wrapbmp->add: bmpheight set to %d (wls=%d, lrbi=%d)\n",wrapbmp->bmp.height,wrapbmp->line_spacing,k2settings->last_rowbase_internal); #endif wrapbmp->bmp.width=region->c2-region->c1+1; bmp_alloc(&wrapbmp->bmp); bw=bmp_bytewidth(&wrapbmp->bmp); memset(bmp_rowptr_from_top(&wrapbmp->bmp,0),255,bw*wrapbmp->bmp.height); for (i=region->r1;i<=region->r2;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(&wrapbmp->bmp,wrapbmp->base+(i-rbase)); s=bmp_rowptr_from_top(k2settings->dst_color?region->bmp:region->bmp8,i)+bpp*region->c1; memcpy(d,s,bw); } #ifdef WILLUSDEBUG if (wrapbmp->bmp.height<=wrapbmp->base) { printf("1. SCREEECH!\n"); printf("wrapbmp = %d x %d, base=%d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,wrapbmp->base); exit(10); } #endif /* Copy hyphen info from added region */ wrapbmp->hyphen = region->hyphen; if (wrapbmp_ends_in_hyphen(wrapbmp)) { wrapbmp->hyphen.r1 += (wrapbmp->base-rbase); wrapbmp->hyphen.r2 += (wrapbmp->base-rbase); wrapbmp->hyphen.ch -= region->c1; wrapbmp->hyphen.c2 -= region->c1; } return; } width0=wrapbmp->bmp.width; /* Starting wrapbmp width */ tmp=&_tmp; bmp_init(tmp); bmp_copy(tmp,&wrapbmp->bmp); tmp->width += gap+region->c2-region->c1+1; if (rh > wrapbmp->base) { wrapbmp->height_extended=1; new_base = rh-1; } else new_base = wrapbmp->base; if (region->r2-rbase > wrapbmp->bmp.height-1-wrapbmp->base) h2=region->r2-rbase; else h2=wrapbmp->bmp.height-1-wrapbmp->base; tmp->height = new_base + h2 + 1; bmp_alloc(tmp); bw=bmp_bytewidth(tmp); memset(bmp_rowptr_from_top(tmp,0),255,bw*tmp->height); bw=bmp_bytewidth(&wrapbmp->bmp); /* printf("3. wbh=%d x %d, tmp=%d x %d x %d, new_base=%d, wbbase=%d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,tmp->width,tmp->height,tmp->bpp,new_base,wrapbmp->base); */ for (i=0;i<wrapbmp->bmp.height;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(tmp,i+new_base-wrapbmp->base) + (k2settings->src_left_to_right ? 0 : tmp->width-1-wrapbmp->bmp.width)*bpp; s=bmp_rowptr_from_top(&wrapbmp->bmp,i); memcpy(d,s,bw); } bw=bpp*(region->c2-region->c1+1); if (region->r1+new_base-rbase<0 || region->r2+new_base-rbase>tmp->height-1) { aprintf(ANSI_YELLOW "INTERNAL ERROR--TMP NOT DIMENSIONED PROPERLY.\n"); aprintf("(%d-%d), tmp->height=%d\n" ANSI_NORMAL, region->r1+new_base-rbase, region->r2+new_base-rbase,tmp->height); exit(10); } for (i=region->r1;i<=region->r2;i++) { unsigned char *d,*s; d=bmp_rowptr_from_top(tmp,i+new_base-rbase) + (k2settings->src_left_to_right ? wrapbmp->bmp.width+gap : 0)*bpp; s=bmp_rowptr_from_top(k2settings->dst_color?region->bmp:region->bmp8,i)+bpp*region->c1; memcpy(d,s,bw); } bmp_copy(&wrapbmp->bmp,tmp); bmp_free(tmp); /* Copy region's hyphen info */ wrapbmp->hyphen = region->hyphen; if (wrapbmp_ends_in_hyphen(wrapbmp)) { wrapbmp->hyphen.r1 += (new_base-rbase); wrapbmp->hyphen.r2 += (new_base-rbase); if (k2settings->src_left_to_right) { wrapbmp->hyphen.ch += width0+gap-region->c1; wrapbmp->hyphen.c2 += width0+gap-region->c1; } else { wrapbmp->hyphen.ch -= region->c1; wrapbmp->hyphen.c2 -= region->c1; } } wrapbmp->base=new_base; #ifdef WILLUSDEBUG if (wrapbmp->bmp.height<=wrapbmp->base) { printf("2. SCREEECH!\n"); printf("wrapbmp = %d x %d, base=%d\n",wrapbmp->bmp.width,wrapbmp->bmp.height,wrapbmp->base); exit(10); } #endif }
/* ** Returns 0 for success, negative number for error code. ** bpp can be 24 or 8. ** */ int bmpdjvu_djvufile_to_bmp(WILLUSBITMAP *bmp,char *infile,int pageno, int dpi,int bpp,FILE *out) { ddjvu_context_t *ctx; ddjvu_document_t *doc; ddjvu_page_t *page; /* ddjvu_page_type_t type; */ ddjvu_rect_t prect; ddjvu_rect_t rrect; ddjvu_format_style_t style; ddjvu_render_mode_t mode; ddjvu_format_t *fmt; int i,iw,ih,idpi,status; ctx=ddjvu_context_create("bmpdjvu_djvufile_to_bmp"); if (ctx==NULL) { nprintf(out,"Cannot create djvu context.\n"); return(-1); } doc=ddjvu_document_create_by_filename(ctx,infile,1); if (doc==NULL) { ddjvu_context_release(ctx); nprintf(out,"Cannot create djvu document context from djvu file %s.\n", infile); return(-2); } i=ddjvu_document_get_pagenum(doc); if (pageno<0 || pageno>i) { ddjvu_document_release(doc); ddjvu_context_release(ctx); nprintf(out,"Page number %d is out of range for djvu file %s.\n",pageno,infile); return(-3); } page=ddjvu_page_create_by_pageno(doc,pageno-1); if (page==NULL) { ddjvu_document_release(doc); ddjvu_context_release(ctx); nprintf(out,"Cannot parse page %d of djvu file %s.\n",pageno,infile); return(-4); } while (!ddjvu_page_decoding_done(page)) handle(1,ctx); if (ddjvu_page_decoding_error(page)) { ddjvu_page_release(page); ddjvu_document_release(doc); ddjvu_context_release(ctx); nprintf(out,"Error decoding page %d of djvu file %s.\n",pageno,infile); return(-5); } /* type= */ ddjvu_page_get_type(page); /* printf("type=%d\n",type); description=ddjvu_page_get_long_description(page); printf("Description='%s'\n",description); */ iw = ddjvu_page_get_width(page); ih = ddjvu_page_get_height(page); idpi = ddjvu_page_get_resolution(page); prect.x=prect.y=0; bmp->width=prect.w=iw*dpi/idpi; bmp->height=prect.h=ih*dpi/idpi; bmp->bpp=(bpp==8) ? 8 : 24; rrect=prect; bmp_alloc(bmp); if (bmp->bpp==8) { int ii; for (ii=0;ii<256;ii++) bmp->red[ii]=bmp->blue[ii]=bmp->green[ii]=ii; } mode=DDJVU_RENDER_COLOR; style=bpp==8 ? DDJVU_FORMAT_GREY8 : DDJVU_FORMAT_RGB24; fmt=ddjvu_format_create(style,0,0); if (fmt==NULL) { ddjvu_page_release(page); ddjvu_document_release(doc); ddjvu_context_release(ctx); nprintf(out,"Error setting DJVU format for djvu file %s (page %d).\n",infile,pageno); return(-6); } ddjvu_format_set_row_order(fmt,1); status=ddjvu_page_render(page,mode,&prect,&rrect,fmt,bmp_bytewidth(bmp),(char *)bmp->data); ddjvu_format_release(fmt); ddjvu_page_release(page); ddjvu_document_release(doc); ddjvu_context_release(ctx); if (!status) { nprintf(out,"Error rendering page %d of djvu file %s.\n",pageno,infile); return(-7); } return(0); }
static int reflowPage(lua_State *L) { DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage"); KOPTContext *kctx = (KOPTContext*) lua_topointer(L, 2); ddjvu_render_mode_t mode = (int) luaL_checkint(L, 3); ddjvu_rect_t prect; ddjvu_rect_t rrect; int px, py, pw, ph, rx, ry, rw, rh, status; px = 0; py = 0; pw = ddjvu_page_get_width(page->page_ref); ph = ddjvu_page_get_height(page->page_ref); prect.x = px; prect.y = py; rx = (int)kctx->bbox.x0; ry = (int)kctx->bbox.y0; rw = (int)(kctx->bbox.x1 - kctx->bbox.x0); rh = (int)(kctx->bbox.y1 - kctx->bbox.y0); double zoom = kctx->zoom*kctx->quality; float scale = ((2*zoom*kctx->dev_width) / (double)pw + \ (2*zoom*kctx->dev_height) / (double)ph) / 2; prect.w = pw * scale; prect.h = ph * scale; rrect.x = rx * scale; rrect.y = ry * scale; rrect.w = rw * scale; rrect.h = rh * scale; printf("rendering page:%d,%d,%d,%d\n",rrect.x,rrect.y,rrect.w,rrect.h); kctx->zoom = scale; WILLUSBITMAP *src = &kctx->src; bmp_init(src); src->width = rrect.w; src->height = rrect.h; src->bpp = 8; bmp_alloc(src); if (src->bpp == 8) { int ii; for (ii = 0; ii < 256; ii++) src->red[ii] = src->blue[ii] = src->green[ii] = ii; } ddjvu_format_set_row_order(page->doc->pixelformat, 1); status = ddjvu_page_render(page->page_ref, mode, &prect, &rrect, page->doc->pixelformat, bmp_bytewidth(src), (char *) src->data); if (kctx->precache) { pthread_t rf_thread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&rf_thread, &attr, k2pdfopt_reflow_bmp, (void*) kctx); pthread_attr_destroy(&attr); } else { k2pdfopt_reflow_bmp(kctx); } return 0; }