root/trunk/examples/sumatrapdf/rev623.diff

Revision 11, 40.1 kB (checked in by bobef, 4 years ago)

Added pdf reader example

  • sumatrapdf.vcproj

    old new  
    11<?xml version="1.0" encoding="Windows-1252"?> 
    22<VisualStudioProject 
    33    ProjectType="Visual C++" 
    4     Version="8.00" 
     4    Version="8,00" 
    55    Name="SumatraPDF" 
    66    ProjectGUID="{836D470A-7050-4423-B938-0ADB24BFA581}" 
    77    RootNamespace="sumatrapdf" 
     
    107107            Name="Release|Win32" 
    108108            OutputDirectory="$(SolutionDir)$(ConfigurationName)" 
    109109            IntermediateDirectory="$(ConfigurationName)" 
    110             ConfigurationType="1
     110            ConfigurationType="2
    111111            CharacterSet="0" 
    112112            WholeProgramOptimization="0" 
    113113            > 
     
    143143                UsePrecompiledHeader="0" 
    144144                WarningLevel="3" 
    145145                Detect64BitPortabilityProblems="false" 
    146                 DebugInformationFormat="3
     146                DebugInformationFormat="0
    147147                CompileAs="0" 
    148148                DisableSpecificWarnings="4996;4244;4267;4995" 
    149149                EnablePREfast="false" 
     
    160160            /> 
    161161            <Tool 
    162162                Name="VCLinkerTool" 
    163                 AdditionalDependencies="freetype231mt.lib comctl32.lib zlib_s.lib jpeg_s.lib winspool.lib Msimg32.lib wininet.lib" 
     163                AdditionalDependencies="shell32.lib comdlg32.lib advapi32.lib ole32.lib comctl32.lib user32.lib gdi32.lib oleaut32.lib kernel32.lib freetype231mt.lib comctl32.lib zlib_s.lib jpeg_s.lib winspool.lib Msimg32.lib wininet.lib" 
    164164                LinkIncremental="1" 
    165165                AdditionalLibraryDirectories="&quot;$(ProjectDir)ext\freetype231&quot;;&quot;$(ProjectDir)ext\zlib&quot;;&quot;$(ProjectDir)ext\jpeg&quot;" 
    166166                IgnoreDefaultLibraryNames="" 
    167                 GenerateDebugInformation="true" 
     167                GenerateDebugInformation="false" 
    168168                SubSystem="2" 
    169169                StackReserveSize="2097152" 
    170170                OptimizeReferences="2" 
     
    199199            /> 
    200200            <Tool 
    201201                Name="VCPostBuildEventTool" 
     202                CommandLine="copy /y release\sumatrapdf.dll ..\..\sumatrapdf.dll" 
    202203            /> 
    203204        </Configuration> 
    204205    </Configurations> 
  • fitz/include/fitz/stm_buffer.h

    old new  
    3030    int eof; 
    3131}; 
    3232 
    33 fz_error *fz_newbuffer(fz_buffer **bufp, int size); 
    34 fz_error *fz_newbufferwithmemory(fz_buffer **bufp, unsigned char *data, int size); 
     33fz_error *fz_newbuffer(fz_buffer **bufp, unsigned int size); 
     34fz_error *fz_newbufferwithmemory(fz_buffer **bufp, unsigned char *data, unsigned int size); 
    3535 
    3636fz_error *fz_rewindbuffer(fz_buffer *buf); 
     37fz_error *fz_rewindbuffer2(fz_buffer *buf); 
    3738fz_error *fz_growbuffer(fz_buffer *buf); 
    3839 
    3940fz_buffer *fz_keepbuffer(fz_buffer *buf); 
  • fitz/include/fitz/stm_stream.h

    old new  
    3131fz_error *fz_openafile(fz_stream **stmp, char *filename); 
    3232 
    3333/* write to memory buffers! */ 
    34 fz_error *fz_openrmemory(fz_stream **stmp, char *buf, int len); 
     34fz_error *fz_openrmemory(fz_stream **stmp, char *buf, unsigned int len); 
    3535fz_error *fz_openrbuffer(fz_stream **stmp, fz_buffer *buf); 
    3636fz_error *fz_openwbuffer(fz_stream **stmp, fz_buffer *buf); 
    3737 
  • fitz/include/mupdf/xref.h

    old new  
    3939 
    4040fz_error *pdf_newxref(pdf_xref **); 
    4141fz_error *pdf_repairxref(pdf_xref *, char *filename); 
    42 fz_error *pdf_loadxref(pdf_xref *, char *filename); 
     42fz_error *pdf_loadxref(pdf_xref *, char *filename,unsigned int size); 
    4343fz_error *pdf_initxref(pdf_xref *); 
    4444 
    4545fz_error *pdf_openpdf(pdf_xref **, char *filename); 
  • fitz/mupdf/pdf_open.c

    old new  
    4040    int i; 
    4141 
    4242    t = fz_seek(xref->file, 0, 2); 
     43 
    4344    if (t == -1) 
    4445        return fz_ioerror(xref->file); 
    4546 
     
    186187{ 
    187188    int n; 
    188189    int c; 
    189  
     190     
    190191    n = fz_seek(xref->file, xref->startxref, 0); 
    191192    if (n < 0) 
    192193        return fz_ioerror(xref->file); 
     
    546547 */ 
    547548 
    548549fz_error * 
    549 pdf_loadxref(pdf_xref *xref, char *filename
     550pdf_loadxref(pdf_xref *xref, char *filename,unsigned int len
    550551{ 
    551552    fz_error *error; 
    552553    fz_obj *size; 
     
    555556 
    556557    char buf[65536];    /* yeowch! */ 
    557558 
    558     pdf_logxref("loadxref '%s' %p\n", filename, xref); 
     559    //pdf_logxref("loadxref '%s' %p\n", filename, xref); 
    559560 
    560     error = fz_openrfile(&xref->file, filename); 
     561    error = len==0?fz_openrfile(&xref->file, filename):fz_openrmemory(&xref->file, filename, len); 
    561562    if (error) 
    562563        return error; 
    563564 
  • fitz/stream/stm_buffer.c

    old new  
    22#include "fitz-stream.h" 
    33 
    44fz_error * 
    5 fz_newbuffer(fz_buffer **bp, int size) 
     5fz_newbuffer(fz_buffer **bp, unsigned int size) 
    66{ 
    77    fz_buffer *b; 
    88 
     
    2323} 
    2424 
    2525fz_error * 
    26 fz_newbufferwithmemory(fz_buffer **bp, unsigned char *data, int size) 
     26fz_newbufferwithmemory(fz_buffer **bp, unsigned char *data, unsigned int size) 
    2727{ 
    2828    fz_buffer *b; 
    2929 
     
    8282    return nil; 
    8383} 
    8484 
    85 fz_error * 
    86 fz_rewindbuffer(fz_buffer *buf) 
     85fz_error * fz_rewindbuffer(fz_buffer *buf) 
    8786{ 
    8887    assert(buf->ownsdata); 
    8988    memmove(buf->bp, buf->rp, buf->wp - buf->rp); 
     
    9291    return nil; 
    9392} 
    9493 
     94fz_error * fz_rewindbuffer2(fz_buffer *buf) 
     95{ 
     96    assert(buf->ownsdata); 
     97    memmove(buf->bp, buf->rp, buf->wp - buf->rp); 
     98    //buf->wp = buf->bp + (buf->wp - buf->rp); 
     99    buf->rp = buf->bp; 
     100    return nil; 
     101} 
     102 
  • fitz/stream/stm_open.c

    old new  
    205205    return openbuffer(stmp, buf, FZ_SWRITE); 
    206206} 
    207207 
    208 fz_error * fz_openrmemory(fz_stream **stmp, char *mem, int len) 
     208fz_error * fz_openrmemory(fz_stream **stmp, char *mem, unsigned int len) 
    209209{ 
    210210    fz_error *error; 
    211211    fz_buffer *buf; 
  • fitz/stream/stm_read.c

    old new  
    2323    if (buf->eof) 
    2424        return 0; 
    2525 
    26     error = fz_rewindbuffer(buf); 
     26    error = stm->kind==FZ_SBUFFER?fz_rewindbuffer2(buf):fz_rewindbuffer(buf); 
    2727    if (error) 
    2828        goto cleanup; 
    2929 
    30     if (buf->ep - buf->wp == 0) 
     30    if (stm->kind!=FZ_SBUFFER && buf->ep - buf->wp == 0) 
    3131    { 
    3232        error = fz_growbuffer(buf); 
    3333        if (error) 
  • src/DisplayModel.cc

    old new  
    217217    return &(_pagesInfo[pageNo-1]); 
    218218} 
    219219 
    220 bool DisplayModel::load(const char *fileName, int startPage, WindowInfo *win)  
     220bool DisplayModel::load(const char *fileName, int startPage, WindowInfo *win, unsigned int size)  
    221221{  
    222222    assert(fileName); 
    223     if (!_pdfEngine->load(fileName, win)) 
     223    if (!_pdfEngine->load(fileName, win, size)) 
    224224        return false; 
    225225 
    226226    if (validPageNo(startPage)) 
  • src/DisplayModel.h

    old new  
    163163 
    164164    /* number of pages in PDF document */ 
    165165    int  pageCount() const { return _pdfEngine->pageCount(); } 
    166     bool load(const char *fileName, int startPage, WindowInfo *win); 
     166    bool load(const char *fileName, int startPage, WindowInfo *win, unsigned int size = 0); 
    167167    bool validPageNo(int pageNo) const { return _pdfEngine->validPageNo(pageNo); } 
    168168    bool hasTocTree() { return _pdfEngine->hasTocTree(); } 
    169169    PdfTocItem *getTocTree() { return _pdfEngine->getTocTree(); } 
  • src/DisplayModelFitz.cc

    old new  
    2020 
    2121DisplayModelFitz *DisplayModelFitz_CreateFromFileName( 
    2222  const char *fileName, 
     23  unsigned int size, 
    2324  SizeD totalDrawAreaSize, 
    2425  int scrollbarXDy, int scrollbarYDx, 
    2526  DisplayMode displayMode, int startPage, 
     
    3132    if (!dm) 
    3233        goto Error; 
    3334 
    34     if (!dm->load(fileName, startPage, win)) 
     35    if (!dm->load(fileName, startPage, win, size)) 
    3536        goto Error; 
    3637 
    3738    dm->setScrollbarsSize(scrollbarXDy, scrollbarYDx); 
  • src/DisplayModelFitz.h

    old new  
    2626 
    2727DisplayModelFitz *DisplayModelFitz_CreateFromFileName( 
    2828  const char *fileName, 
     29  unsigned int size, 
    2930  SizeD totalDrawAreaSize, 
    3031  int scrollbarXDy, int scrollbarYDx, 
    3132  DisplayMode displayMode, int startPage, 
  • src/DisplayModelSplash.cc

    old new  
    337337   */ 
    338338DisplayModelSplash *DisplayModelSplash_CreateFromFileName( 
    339339  const char *fileName, 
     340  unsigned int size, 
    340341  SizeD totalDrawAreaSize, 
    341342  int scrollbarXDy, int scrollbarYDx, 
    342343  DisplayMode displayMode, int startPage, 
     
    346347    if (!dm) 
    347348        goto Error; 
    348349 
    349     if (!dm->load(fileName, startPage, win)) 
     350    if (!dm->load(fileName, startPage, win, size)) 
    350351        goto Error; 
    351352 
    352353    dm->setScrollbarsSize(scrollbarXDy, scrollbarYDx); 
  • src/DisplayModelSplash.h

    old new  
    6969}; 
    7070 
    7171DisplayModelSplash *DisplayModelSplash_CreateFromFileName(const char *fileName, 
     72                                            unsigned int size, 
    7273                                            SizeD totalDrawAreaSize, 
    7374                                            int scrollbarXDy, int scrollbarYDx, 
    7475                                            DisplayMode displayMode, int startPage, 
  • src/PdfEngine.cc

    old new  
    221221    free(_linksForPage); 
    222222} 
    223223 
    224 bool PdfEnginePoppler::load(const char *fileName, WindowInfo *win
     224bool PdfEnginePoppler::load(const char *fileName, WindowInfo *win, unsigned int size
    225225{ 
    226     setFileName(fileName)
     226   MemStream *ms = NULL
    227227    _windowInfo = win; 
    228228    /* note: don't delete fileNameStr since PDFDoc takes ownership and deletes them itself */ 
    229     GooString *fileNameStr = new GooString(fileName); 
    230     if (!fileNameStr) return false; 
    231229 
    232     _pdfDoc = new PDFDoc(fileNameStr, NULL, NULL, (void*)win); 
     230    if(size==0) 
     231    { 
     232        setFileName(fileName); 
     233        GooString *fileNameStr = new GooString(fileName); 
     234        if (!fileNameStr) return false; 
     235        _pdfDoc = new PDFDoc(fileNameStr, NULL, NULL, (void*)win); 
     236    } 
     237    else 
     238    { 
     239        Object obj; 
     240        obj.initNull(); 
     241        setFileName("memory stream"); 
     242        ms=new MemStream((char*)fileName,0,size,&obj); 
     243        _pdfDoc = new PDFDoc(ms,NULL,NULL,(void*)win); 
     244    } 
    233245    if (!_pdfDoc->isOk()) { 
     246        if(ms) delete ms; 
    234247        return false; 
    235248    } 
    236249    _pageCount = _pdfDoc->getNumPages(); 
     
    235248    } 
    236249    _pageCount = _pdfDoc->getNumPages(); 
    237250    _linksForPage = (Links**)malloc(_pageCount * sizeof(Links*)); 
    238     if (!_linksForPage) return false; 
     251    if (!_linksForPage) 
     252    { 
     253        if(ms) delete ms; 
     254        return false; 
     255    } 
    239256    for (int i=0; i < _pageCount; i++) 
    240257        _linksForPage[i] = NULL; 
     258    if(ms) delete ms; 
    241259    return true; 
    242260} 
    243261 
     
    474492    delete _popplerEngine;         
    475493} 
    476494 
    477 bool PdfEngineFitz::load(const char *fileName, WindowInfo *win
     495bool PdfEngineFitz::load(const char *fileName, WindowInfo *win, unsigned int size
    478496{ 
    479497    assert(!_popplerEngine); 
    480498    _windowInfo = win; 
    481     setFileName(fileName); 
     499    if(size>0) setFileName(fileName); 
     500    else setFileName("memory stream"); 
    482501    fz_error *error = pdf_newxref(&_xref); 
    483502    if (error) 
    484503        goto Error; 
     
    483502    if (error) 
    484503        goto Error; 
    485504 
    486     error = pdf_loadxref(_xref, (char*)fileName); 
     505    error = pdf_loadxref(_xref, (char*)fileName,size); 
    487506    if (error) { 
    488507        if (!strncmp(error->msg, "ioerror", 7)) 
    489508            goto Error; 
  • src/PdfEngine.h

    old new  
    156156 
    157157    int pageCount(void) const { return _pageCount; } 
    158158 
    159     virtual bool load(const char *fileName, WindowInfo *windowInfo) = 0; 
     159    virtual bool load(const char *fileName, WindowInfo *windowInfo, unsigned int size = 0) = 0; 
    160160    virtual int pageRotation(int pageNo) = 0; 
    161161    virtual SizeD pageSize(int pageNo) = 0; 
    162162    virtual RenderedBitmap *renderBitmap(int pageNo, double zoomReal, int rotation, 
     
    187187public: 
    188188    PdfEnginePoppler(); 
    189189    virtual ~PdfEnginePoppler(); 
    190     virtual bool load(const char *fileName, WindowInfo* windowInfo); 
     190    virtual bool load(const char *fileName, WindowInfo* windowInfo, unsigned int size = 0); 
    191191    virtual int pageRotation(int pageNo); 
    192192    virtual SizeD pageSize(int pageNo); 
    193193    virtual RenderedBitmap *renderBitmap(int pageNo, double zoomReal, int rotation, 
     
    215215public: 
    216216    PdfEngineFitz(); 
    217217    virtual ~PdfEngineFitz(); 
    218     virtual bool load(const char *fileName, WindowInfo* windowInfo); 
     218    virtual bool load(const char *fileName, WindowInfo* windowInfo, unsigned int size = 0); 
    219219    virtual int pageRotation(int pageNo); 
    220220    virtual SizeD pageSize(int pageNo); 
    221221    virtual RenderedBitmap *renderBitmap(int pageNo, double zoomReal, int rotation, 
  • src/SumatraPDF.cpp

    old new  
    166166 
    167167#ifdef _WINDLL 
    168168static bool                         gRunningDLL = true; 
     169SUMATRA_CREATE_PARAMS               gCreateParams; 
    169170#else 
    170171static bool                         gRunningDLL = false; 
    171172#endif 
     
    395396    NULL 
    396397}; 
    397398 
     399void debugOut(char* str) 
     400{ 
     401    fwrite(str,1,strlen(str),stdout); 
     402    fflush(stdout); 
     403} 
     404 
    398405#define LANGS_COUNT dimof(g_langs) 
    399406 
    400407const char* CurrLangNameGet() { 
     
    14171424} 
    14181425 
    14191426static WindowInfo *WindowInfo_New(HWND hwndFrame) { 
    1420     WindowInfo * win = WindowInfo_FindByHwnd(hwndFrame)
     1427    WindowInfo * win = hwndFrame?WindowInfo_FindByHwnd(hwndFrame):NULL
    14211428    assert(!win); 
    14221429 
    1423     win = new WindowInfo();; 
     1430    win = new WindowInfo(); 
    14241431    if (!win) 
    14251432        return NULL; 
    14261433 
     
    18731880    } 
    18741881 
    18751882    if (gGlobalPrefs.m_useFitz) { 
    1876         win->dm = DisplayModelFitz_CreateFromFileName(fileName,  
     1883        win->dm = DisplayModelFitz_CreateFromFileName(fileName, 0,  
    18771884            totalDrawAreaSize, scrollbarYDx, scrollbarXDy, displayMode, startPage, win); 
    18781885    } else { 
    1879         win->dm = DisplayModelSplash_CreateFromFileName(fileName,  
     1886        win->dm = DisplayModelSplash_CreateFromFileName(fileName, 0,  
    18801887            totalDrawAreaSize, scrollbarYDx, scrollbarXDy, displayMode, startPage, win); 
    18811888    } 
    18821889 
     
    19901997    assert(win); 
    19911998    if (!win) return; 
    19921999 
     2000    if(gCreateParams.cbPageChanged!=NULL && gCreateParams.cbPageChanged(win)) return; 
     2001    if(gRunningDLL) return; 
     2002 
    19932003#if 0 
    19942004    if (!win->dmSplash->pdfDoc) 
    19952005        return; 
     
    20122022{ 
    20132023    assert(win); 
    20142024    if (!win) return; 
     2025    if(win->hwndCanvas) 
     2026    { 
    20152027    if (delayed) 
    20162028        PostMessage(win->hwndCanvas, WM_APP_REPAINT_DELAYED, 0, 0); 
    20172029    else 
     
    20162028        PostMessage(win->hwndCanvas, WM_APP_REPAINT_DELAYED, 0, 0); 
    20172029    else 
    20182030        PostMessage(win->hwndCanvas, WM_APP_REPAINT_NOW, 0, 0); 
     2031    } 
     2032    else if(gCreateParams.cbRepaint!=NULL) gCreateParams.cbRepaint(win,!delayed); 
    20192033} 
    20202034 
    20212035static void triggerRepaintDisplayNow(WindowInfo* win) 
     
    20552069        si.nMax = canvasDx-1; 
    20562070        si.nPage = drawAreaDx; 
    20572071    } 
    2058     SetScrollInfo(win->hwndCanvas, SB_HORZ, &si, TRUE); 
     2072    if (gCreateParams.cbSetScrollbarsSize!=NULL) gCreateParams.cbSetScrollbarsSize(win,1,si.nPos,si.nMin,si.nMax,si.nPage); 
     2073    if (win->hwndCanvas) SetScrollInfo(win->hwndCanvas, SB_HORZ, &si, TRUE); 
    20592074 
    20602075    if (drawAreaDy >= canvasDy) { 
    20612076        si.nMin = 0; 
     
    20752090        si.nMax = canvasDy-1; 
    20762091        si.nPage = drawAreaDy; 
    20772092    } 
    2078     SetScrollInfo(win->hwndCanvas, SB_VERT, &si, TRUE); 
     2093    if (gCreateParams.cbSetScrollbarsSize!=NULL) gCreateParams.cbSetScrollbarsSize(win,2,si.nPos,si.nMin,si.nMax,si.nPage); 
     2094    if (win->hwndCanvas) SetScrollInfo(win->hwndCanvas, SB_VERT, &si, TRUE); 
    20792095} 
    20802096 
    20812097static void WindowInfo_ResizeToWindow(WindowInfo *win) 
     
    26382654    } 
    26392655} 
    26402656 
     2657void Sumatra_Render(WindowInfo *win, HDC hdc,int x,int y,int w,int h) 
     2658{ 
     2659    RECT                bounds; 
     2660    RenderedBitmap *    renderedBmp = NULL; 
     2661 
     2662    assert(win); 
     2663    if (!win) return; 
     2664    DisplayModel* dm = win->dm; 
     2665    assert(dm); 
     2666    if (!dm) return; 
     2667#if 0 // TODO: write the equivalent dm->isOk() ? 
     2668    assert(dm->pdfDoc); 
     2669    if (!dm->pdfDoc) return; 
     2670#endif 
     2671 
     2672    //assert(win->hdcToDraw); 
     2673    //hdc = win->hdcToDraw; 
     2674    /*RECT rct; 
     2675    rct.left=x; 
     2676    rct.top=y; 
     2677    rct.bottom=y+h; 
     2678    rct.right=x+w; 
     2679    FillRect(hdc, &rct, gBrushBg);*/ 
     2680 
     2681    DBG_OUT("WindowInfo_Paint() "); 
     2682    for (int pageNo = 1; pageNo <= dm->pageCount(); ++pageNo) { 
     2683        PdfPageInfo *pageInfo = dm->getPageInfo(pageNo); 
     2684        if (!pageInfo->visible) 
     2685            continue; 
     2686        assert(pageInfo->shown); 
     2687        if (!pageInfo->shown) 
     2688            continue; 
     2689 
     2690        //BitmapCacheEntry *entry = BitmapCache_Find(dm, pageNo, dm->zoomReal(), dm->rotation()); 
     2691        BitmapCacheEntry *entry = BitmapCache_Find(dm, pageNo); 
     2692 
     2693        if (entry) 
     2694            renderedBmp = entry->bitmap; 
     2695 
     2696        if (!renderedBmp) 
     2697            DBG_OUT("   missing bitmap on visible page %d\n", pageNo); 
     2698 
     2699        int xSrc = (int)pageInfo->bitmapX; 
     2700        int ySrc = (int)pageInfo->bitmapY; 
     2701        int bmpDx = (int)pageInfo->bitmapDx; 
     2702        int bmpDy = (int)pageInfo->bitmapDy; 
     2703        int xDest = (int)pageInfo->screenX+x; 
     2704        int yDest = (int)pageInfo->screenY+y; 
     2705 
     2706        if (!entry) { 
     2707            /* TODO: assert is queued for rendering ? */ 
     2708            HFONT fontRightTxt = Win32_Font_GetSimple(hdc, "Tahoma", 14); 
     2709            HFONT origFont = (HFONT)SelectObject(hdc, fontRightTxt); /* Just to remember the orig font */ 
     2710            bounds.left = xDest; 
     2711            bounds.top = yDest; 
     2712            bounds.right = xDest + bmpDx; 
     2713            bounds.bottom = yDest + bmpDy; 
     2714            FillRect(hdc, &bounds, gBrushWhite); 
     2715            DrawCenteredText(hdc, &bounds, "Please wait - rendering..."); 
     2716            DBG_OUT("drawing empty %d ", pageNo); 
     2717            if (origFont) 
     2718                SelectObject(hdc, origFont); 
     2719            Win32_Font_Delete(fontRightTxt); 
     2720            continue; 
     2721        } 
     2722 
     2723        if (BITMAP_CANNOT_RENDER == renderedBmp) { 
     2724            bounds.left = xDest; 
     2725            bounds.top = yDest; 
     2726            bounds.right = xDest + bmpDx; 
     2727            bounds.bottom = yDest + bmpDy; 
     2728            FillRect(hdc, &bounds, gBrushWhite); 
     2729            DrawCenteredText(hdc, &bounds, "Couldn't render the page"); 
     2730            continue; 
     2731        } 
     2732 
     2733        DBG_OUT("page %d ", pageNo); 
     2734 
     2735        int renderedBmpDx = renderedBmp->dx(); 
     2736        int renderedBmpDy = renderedBmp->dy(); 
     2737        int currPageDx = pageInfo->currDx; 
     2738        int currPageDy = pageInfo->currDy; 
     2739        HBITMAP hbmp = renderedBmp->createDIBitmap(hdc); 
     2740        if (!hbmp) 
     2741            continue; 
     2742 
     2743        // Frame info 
     2744        int fx = xDest, fy = yDest, fw = bmpDx - 4, fh = bmpDy - 4; 
     2745        // Shadow info 
     2746        int sx = fx + 4, sy = fy + 4, sw = fw, sh = fh; 
     2747        // Adjust frame/shadow info base on page/bitmap size 
     2748        if (bmpDy < currPageDy) { 
     2749            if (yDest <= 0) { 
     2750                sy = fy; 
     2751                sh = sh + 4; 
     2752                fy = fy - 1; 
     2753                if (yDest + bmpDy < currPageDy) { 
     2754                    sh = sh + 5; 
     2755                    fh = fh + 6; 
     2756                } 
     2757            } 
     2758            else { 
     2759                sh = sh + 4; 
     2760                fh = fh + 6; 
     2761            } 
     2762        } 
     2763        if (bmpDx < currPageDx) { 
     2764            fw = sw = bmpDx + 1; 
     2765            if (xDest <= 0) { 
     2766                fx = fx - 1; 
     2767            } 
     2768        } 
     2769        // Draw shadow 
     2770        RECT rc; 
     2771        HBRUSH br = CreateSolidBrush(RGB(0x44, 0x44, 0x44)); 
     2772        rect_set(&rc, sx, sy, sw, sh); 
     2773        FillRect(hdc, &rc, br); 
     2774        DeleteBrush(br); 
     2775 
     2776        // Draw frame 
     2777        HPEN pe = CreatePen(PS_SOLID, 1, RGB(0x88, 0x88, 0x88)); 
     2778        SelectObject(hdc, pe); 
     2779        DrawLineSimple(hdc, fx, fy, fx+fw-1, fy); 
     2780        DrawLineSimple(hdc, fx, fy, fx, fy+fh-1); 
     2781        DrawLineSimple(hdc, fx+fw-1, fy, fx+fw-1, fy+fh-1); 
     2782        DrawLineSimple(hdc, fx, fy+fh-1, fx+fw-1, fy+fh-1); 
     2783        DeletePen(pe); 
     2784 
     2785        HDC bmpDC = CreateCompatibleDC(hdc); 
     2786        if (bmpDC) { 
     2787            SelectObject(bmpDC, hbmp); 
     2788            if ((renderedBmpDx < currPageDx) || (renderedBmpDy < currPageDy)) 
     2789                StretchBlt(hdc, fx+1, fy+1, fw-2, fh-2, bmpDC, xSrc, ySrc, renderedBmpDx, renderedBmpDy, SRCCOPY); 
     2790            else 
     2791                BitBlt(hdc, fx+1, fy+1, fw-2, fh-2, bmpDC, xSrc, ySrc, SRCCOPY); 
     2792            DeleteDC(bmpDC); 
     2793        } 
     2794        DeleteObject(hbmp); 
     2795    } 
     2796 
     2797    if (win->showSelection) 
     2798        PaintSelection(win, hdc); 
     2799     
     2800    DBG_OUT("\n"); 
     2801    if (!gDebugShowLinks) 
     2802        return; 
     2803 
     2804    RectI drawAreaRect; 
     2805    /* debug code to visualize links */ 
     2806    drawAreaRect.x = (int)dm->areaOffset.x; 
     2807    drawAreaRect.y = (int)dm->areaOffset.y; 
     2808    drawAreaRect.dx = dm->drawAreaSize.dxI(); 
     2809    drawAreaRect.dy = dm->drawAreaSize.dyI(); 
     2810 
     2811    for (int linkNo = 0; linkNo < dm->linkCount(); ++linkNo) { 
     2812        PdfLink *pdfLink = dm->link(linkNo); 
     2813 
     2814        RectI rectLink, intersect; 
     2815        rectLink.x = pdfLink->rectCanvas.x; 
     2816        rectLink.y = pdfLink->rectCanvas.y; 
     2817        rectLink.dx = pdfLink->rectCanvas.dx; 
     2818        rectLink.dy = pdfLink->rectCanvas.dy; 
     2819 
     2820        if (RectI_Intersect(&rectLink, &drawAreaRect, &intersect)) { 
     2821            RECT rectScreen; 
     2822            rectScreen.left = (LONG) ((double)intersect.x - dm->areaOffset.x); 
     2823            rectScreen.top = (LONG) ((double)intersect.y - dm->areaOffset.y); 
     2824            rectScreen.right = rectScreen.left + rectLink.dx; 
     2825            rectScreen.bottom = rectScreen.top + rectLink.dy; 
     2826            FillRect(hdc, &rectScreen, gBrushLinkDebug); 
     2827            DBG_OUT("  link on screen rotate=%d, (x=%d, y=%d, dx=%d, dy=%d)\n", 
     2828                dm->rotation() + dm->pagesInfo[pdfLink->pageNo-1].rotation, 
     2829                rectScreen.left, rectScreen.top, rect_dx(&rectScreen), rect_dy(&rectScreen)); 
     2830        } 
     2831    } 
     2832} 
     2833 
    26412834/* TODO: change the name to DrawAbout. 
    26422835   Draws the about screen a remember some state for hyperlinking. 
    26432836   It transcribes the design I did in graphics software - hopeless 
     
    27292922 
    27302923static void DrawAbout(HWND hwnd, HDC hdc, PAINTSTRUCT *ps) 
    27312924{ 
     2925    //no disrespect, but about is inappropriate for embedded usage 
     2926    if(gRunningDLL) 
     2927    { 
     2928        RECT rc; 
     2929        GetClientRect(hwnd, &rc); 
     2930        HBRUSH brushBg = CreateSolidBrush(0xffffff); 
     2931        FillRect(hdc, &rc, brushBg); 
     2932        DeleteObject(brushBg); 
     2933        return; 
     2934    } 
     2935 
    27322936    RECT            rcTmp; 
    27332937    SIZE            txtSize; 
    27342938    int             totalDx, totalDy; 
     
    30153219        win->linkOnLastButtonDown = win->dm->linkAtPosition(x, y); 
    30163220        /* dragging mode only starts when we're not on a link */ 
    30173221        if (!win->linkOnLastButtonDown) { 
    3018             SetCapture(win->hwndCanvas); 
     3222           if(win->hwndCanvas) SetCapture(win->hwndCanvas); 
    30193223            win->mouseAction = MA_DRAGGING; 
    30203224            win->dragPrevPosX = x; 
    30213225            win->dragPrevPosY = y; 
    3022             SetCursor(gCursorDrag); 
     3226            if(win->hwndCanvas) SetCursor(gCursorDrag); 
     3227            else if(gCreateParams.cbSetCursor!=NULL) gCreateParams.cbSetCursor(win,3); 
    30233228            DBG_OUT(" dragging start, x=%d, y=%d\n", x, y); 
    30243229        } 
    30253230    } 
     
    30393244    assert(win->dm); 
    30403245    if (!win->dm) return; 
    30413246 
    3042     if (win->mouseAction == MA_DRAGGING && (GetCapture() == win->hwndCanvas)) { 
     3247    if (win->mouseAction == MA_DRAGGING && (win->hwndCanvas==NULL || (GetCapture() == win->hwndCanvas))) { 
    30433248        dragDx = 0; dragDy = 0; 
    30443249        dragDx = x - win->dragPrevPosX; 
    30453250        dragDy = y - win->dragPrevPosY; 
     
    30483253        WinMoveDocBy(win, dragDx, -dragDy*2); 
    30493254        win->dragPrevPosX = x; 
    30503255        win->dragPrevPosY = y; 
    3051         SetCursor(gCursorArrow); 
    3052         ReleaseCapture();             
     3256        if(win->hwndCanvas) 
     3257        { 
     3258            SetCursor(gCursorArrow); 
     3259            ReleaseCapture();             
     3260        } 
     3261        else if(gCreateParams.cbSetCursor!=NULL) gCreateParams.cbSetCursor(win,1); 
    30533262        return; 
    30543263    } 
    30553264 
     
    30753284        assert(win->dm); 
    30763285        if (!win->dm) return; 
    30773286        if (win->mouseAction == MA_SELECTING) { 
    3078             SetCursor(gCursorArrow); 
     3287            if(win->hwndCanvas) SetCursor(gCursorArrow); 
     3288            else if(gCreateParams.cbSetCursor!=NULL) gCreateParams.cbSetCursor(win,1); 
    30793289            win->selectionRect.dx = x - win->selectionRect.x; 
    30803290            win->selectionRect.dy = y - win->selectionRect.y; 
    30813291            triggerRepaintDisplayNow(win); 
     
    30913301                return; 
    30923302            } 
    30933303            link = win->dm->linkAtPosition(x, y); 
    3094             if (link) 
    3095                 SetCursor(gCursorHand); 
    3096             else 
    3097                 SetCursor(gCursorArrow); 
     3304            //this is lame. why not checking if the the cursor is actually changed instead of wasting cpu? 
     3305            if(win->hwndCanvas) 
     3306            { 
     3307                if (link) 
     3308                    SetCursor(gCursorHand); 
     3309                else 
     3310                    SetCursor(gCursorArrow); 
     3311            } 
     3312            else if(gCreateParams.cbSetCursor!=NULL) 
     3313            { 
     3314                if (link) 
     3315                    gCreateParams.cbSetCursor(win,2); 
     3316                else 
     3317                    gCreateParams.cbSetCursor(win,1); 
     3318            } 
    30983319        } 
    30993320    } else if (WS_ABOUT == win->state) { 
    31003321        url = AboutGetLink(win, x, y); 
     
    31613382        return; 
    31623383    } 
    31633384 
    3164     if ((key & MK_CONTROL) != 0
     3385    if ((key & MK_CONTROL) != 0 && (!gRunningDLL || gCreateParams.bSelection)
    31653386        OnSelectionStart(win, x, y); 
    31663387    else 
    31673388        OnDraggingStart(win, x, y); 
     
    31803401        return; 
    31813402    } 
    31823403 
    3183     if ((key & MK_CONTROL) != 0
     3404    if ((key & MK_CONTROL) != 0 && (!gRunningDLL || gCreateParams.bSelection)
    31843405        OnSelectionStop(win, x, y); 
    31853406    else 
    31863407        OnDraggingStop(win, x, y); 
     
    33623583            win->HideTocBox(); 
    33633584            MenuUpdateBookmarksStateForWindow(win); 
    33643585        } 
    3365         win->ClearTocBox(); 
     3586        if(!gRunningDLL) win->ClearTocBox(); 
    33663587        delete win->dm; 
    33673588        win->dm = NULL; 
    3368         WindowInfo_RedrawAll(win); 
    3369         WindowInfo_UpdateFindbox(win); 
     3589        if(!gRunningDLL) 
     3590        { 
     3591            WindowInfo_RedrawAll(win); 
     3592            WindowInfo_UpdateFindbox(win); 
     3593        } 
    33703594        DeleteOldSelectionInfo(win); 
    33713595    } else { 
    3372         HWND hwndToDestroy = win->hwndFrame; 
     3596        HWND hwndToDestroy; 
     3597        hwndToDestroy = win->hwndFrame; 
    33733598        WindowInfoList_Remove(win); 
    33743599        WindowInfo_Delete(win); 
    33753600        DragAcceptFiles(hwndToDestroy, FALSE); 
     
    49965221            return WM_HSCROLL_HANDLED; 
    49975222 
    49985223        case WM_MOUSELEAVE: 
    4999             win->hwndTracker = NULL; 
     5224            if(win) win->hwndTracker = NULL; 
    50005225            return 0; 
    50015226 
    50025227        case WM_MOUSEMOVE: 
    5003             win->TrackMouse(hwnd); 
    50045228            if (win) 
     5229            { 
     5230                win->TrackMouse(hwnd); 
    50055231                OnMouseMove(win, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), wParam); 
     5232            } 
    50065233            break; 
    50075234 
    50085235        case WM_LBUTTONDOWN: 
     
    58296056    gGlobalPrefs.m_bgColor = col; 
    58306057} 
    58316058 
     6059#ifndef _WINDLL 
    58326060int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
    58336061{ 
    58346062    StrList *           argListRoot; 
     
    60416269    //histDump(); 
    60426270    return (int) msg.wParam; 
    60436271} 
     6272#endif 
    60446273 
    60456274// Code for DLL interace 
    60466275static WindowInfo* CreateEmpty(HWND parentHandle) { 
    6047     WindowInfo* pdfWin
    6048     HWND        hwndCanvas
     6276    WindowInfo* pdfWin = NULL
     6277    HWND        hwndCanvas = NULL
    60496278    pdfWin = WindowInfo_New(parentHandle); 
    6050     hwndCanvas = CreateWindow( 
     6279    if(parentHandle) hwndCanvas = CreateWindow( 
    60516280        CANVAS_CLASS_NAME, NULL, 
    60526281        WS_CHILD | WS_HSCROLL | WS_VSCROLL, 
    60536282        CW_USEDEFAULT, CW_USEDEFAULT, 
     
    60596288    return pdfWin; 
    60606289} 
    60616290 
    6062 static void OpenPdf(WindowInfo* pdfWin,const char *fileName, HWND parentHandle) 
     6291static void OpenPdf(WindowInfo* pdfWin,const char *fileName, unsigned int size, HWND parentHandle) 
    60636292{ 
    60646293    assert(fileName); 
    60656294    if (!fileName) return; 
     
    60666295    assert(pdfWin); 
    60676296    if (!pdfWin) return; 
    60686297 
    6069     pdfWin->GetCanvasSize(); 
    6070     SizeI maxCanvasSize = GetMaxCanvasSize(pdfWin); 
    60716298    SizeD totalDrawAreaSize(pdfWin->winSize()); 
    60726299    DisplayMode displayMode = DEFAULT_DISPLAY_MODE; 
    60736300    int offsetX = 0; 
     
    60776304    int scrollbarXDy = 0; 
    60786305 
    60796306    if (gGlobalPrefs.m_useFitz) { 
    6080         pdfWin->dm = DisplayModelFitz_CreateFromFileName(fileName,  
     6307        pdfWin->dm = DisplayModelFitz_CreateFromFileName(fileName, size,  
    60816308            totalDrawAreaSize, scrollbarYDx, scrollbarXDy, displayMode, startPage, pdfWin); 
    60826309    }  
    60836310    else { 
    6084         pdfWin->dm = DisplayModelSplash_CreateFromFileName(fileName,  
     6311        pdfWin->dm = DisplayModelSplash_CreateFromFileName(fileName, size, 
    60856312            totalDrawAreaSize, scrollbarYDx, scrollbarXDy, displayMode, startPage, pdfWin); 
    60866313    } 
    60876314 
     
    60906317    double zoomVirtual = DEFAULT_ZOOM; 
    60916318    int rotation = DEFAULT_ROTATION; 
    60926319 
    6093     UINT menuId = MenuIdFromVirtualZoom(zoomVirtual); 
    6094     ZoomMenuItemCheck(GetMenu(pdfWin->hwndFrame), menuId); 
     6320    if(!gRunningDLL) //running from DLL, so don't look for Sumatra's UI 
     6321    { 
     6322        UINT menuId = MenuIdFromVirtualZoom(zoomVirtual); 
     6323        ZoomMenuItemCheck(GetMenu(pdfWin->hwndFrame), menuId); 
     6324    } 
    60956325 
    60966326    pdfWin->dm->relayout(zoomVirtual, rotation); 
    60976327    if (!pdfWin->dm->validPageNo(startPage)) 
     
    60976327    if (!pdfWin->dm->validPageNo(startPage)) 
    60986328        startPage = 1; 
    60996329    offsetY = 0; 
     6330 
    61006331    pdfWin->dm->goToPage(startPage, offsetY, offsetX); 
    6101     WindowInfo_ResizeToPage(pdfWin, startPage); 
    6102     WindowInfoList_Add(pdfWin); 
     6332 
     6333    if(!gRunningDLL) //running from DLL, so let the embedder handle the canvas size as he pleases 
     6334    { 
     6335       WindowInfo_ResizeToPage(pdfWin, startPage); 
     6336       WindowInfoList_Add(pdfWin); 
    61036337 
    6104     RECT rect; 
    6105     if (GetWindowRect(pdfWin->hwndFrame , &rect) != 0) 
    6106    
    6107         int nWidth = rect_dx(&rect); 
    6108         int nHeight = rect_dy(&rect); 
    6109         WinResizeClientArea(pdfWin->hwndCanvas, nWidth, nHeight); 
    6110    
     6338       RECT rect; 
     6339       if (GetWindowRect(pdfWin->hwndFrame , &rect) != 0) 
     6340       
     6341           int nWidth = rect_dx(&rect); 
     6342           int nHeight = rect_dy(&rect); 
     6343           WinResizeClientArea(pdfWin->hwndCanvas, nWidth, nHeight); 
     6344       
    61116345 
    6112     ShowWindow(pdfWin->hwndFrame, SW_SHOW); 
    6113     ShowWindow(pdfWin->hwndCanvas, SW_SHOW); 
    6114     UpdateWindow(pdfWin->hwndFrame); 
    6115     UpdateWindow(pdfWin->hwndCanvas); 
     6346       ShowWindow(pdfWin->hwndFrame, SW_SHOW); 
     6347       ShowWindow(pdfWin->hwndCanvas, SW_SHOW); 
     6348       UpdateWindow(pdfWin->hwndFrame); 
     6349       UpdateWindow(pdfWin->hwndCanvas); 
     6350    } 
     6351    else if(pdfWin->hwndCanvas) ShowWindow(pdfWin->hwndCanvas, SW_HIDE); 
    61166352} 
    61176353 
    6118 void Sumatra_LoadPDF(WindowInfo* pdfWin, const char *pdfFile
     6354void Sumatra_LoadPDF(WindowInfo* pdfWin, const char *pdfFile, unsigned int size
    61196355{ 
    61206356    int  pdfOpened = 0; 
    6121     OpenPdf(pdfWin, pdfFile, pdfWin->hwndFrame); 
     6357    OpenPdf(pdfWin, pdfFile, size, pdfWin->hwndFrame); 
    61226358    ++pdfOpened; 
    6123     if (pdfWin) 
    6124         ShowWindow(pdfWin->hwndFrame, SW_SHOWNORMAL); 
    61256359} 
    61266360 
    61276361void Sumatra_PrintPDF(WindowInfo* pdfWin, const char *pdfFile, long showOptionWindow) 
     
    61466380        SwitchToDisplayMode(pdfWin, (DisplayMode)displayMode); 
    61476381} 
    61486382 
     6383long Sumatra_GetDisplayMode(WindowInfo* pdfWin) 
     6384{ 
     6385    if (WindowInfo_PdfLoaded(pdfWin)) return pdfWin->dm->displayMode(); 
     6386    else return -1; 
     6387} 
     6388 
     6389 
    61496390long Sumatra_GoToNextPage(WindowInfo* pdfWin) 
    61506391{ 
    61516392    if (!WindowInfo_PdfLoaded(pdfWin)) 
     
    62386479    return (long)zoomLevel; 
    62396480}  
    62406481 
    6241 void Sumatra_Resize(WindowInfo* pdfWin
     6482void Sumatra_Resize(WindowInfo* pdfWin, int nWidth, int nHeight
    62426483{ 
    6243     RECT rect; 
    6244     if (GetWindowRect(pdfWin->hwndFrame , &rect) != 0) 
    6245     { 
    6246         int nWidth = rect_dx(&rect); 
    6247         int nHeight = rect_dy(&rect); 
    6248         WinResizeClientArea(pdfWin->hwndCanvas, nWidth, nHeight); 
    6249     } 
     6484    if (WindowInfo_PdfLoaded(pdfWin)) 
     6485    { 
     6486        if(pdfWin->hwndCanvas) WinResizeClientArea(pdfWin->hwndCanvas, nWidth, nHeight); 
     6487        else pdfWin->dm->changeTotalDrawAreaSize(SizeI(nWidth,nHeight)); 
     6488    } 
    62506489} 
    62516490 
    62526491void Sumatra_ClosePdf(WindowInfo* pdfWin) 
     
    62556494        CloseWindow(pdfWin, FALSE); 
    62566495} 
    62576496 
    6258 WindowInfo* Sumatra_Init(HWND pHandle) 
     6497void Sumatra_ScrollY(WindowInfo *win,int type,int pos) 
     6498
     6499    if (WindowInfo_PdfLoaded(win)) 
     6500    { 
     6501        if (DM_SINGLE_PAGE == win->dm->displayMode() && ZOOM_FIT_PAGE == win->dm->zoomVirtual()) 
     6502        { 
     6503            if(type==1) win->dm->goToPage(pos + 1, 0); 
     6504            else 
     6505            { 
     6506                int pageNumber = win->dm->currentPageNo()+pos+(pos>0?1:-1); 
     6507                if (win->dm->validPageNo(pageNumber)) 
     6508                win->dm->goToPage(pageNumber, 0); 
     6509            } 
     6510        } 
     6511        else 
     6512        { 
     6513            if(type==1) win->dm->scrollYTo(pos); 
     6514            else win->dm->scrollYBy(pos,true); 
     6515        } 
     6516    } 
     6517
     6518 
     6519void Sumatra_ScrollX(WindowInfo *win,int type,int pos) 
     6520
     6521    if (WindowInfo_PdfLoaded(win)) 
     6522    { 
     6523        if(type==1) win->dm->scrollXTo(pos); 
     6524        else win->dm->scrollXBy(pos); 
     6525    } 
     6526
     6527 
     6528void Sumatra_MouseMove(WindowInfo *win,int x,int y,unsigned int flags) 
     6529
     6530    if(win) OnMouseMove(win,x,y,flags); 
     6531
     6532 
     6533void Sumatra_MouseLeftDown(WindowInfo *win,int x,int y,unsigned int flags) 
     6534
     6535    if(win) OnMouseLeftButtonDown(win,x,y,flags); 
     6536
     6537 
     6538void Sumatra_MouseLeftUp(WindowInfo *win,int x,int y,unsigned int flags) 
     6539
     6540    if(win) OnMouseLeftButtonUp(win,x,y,flags); 
     6541
     6542 
     6543WindowInfo* Sumatra_Init(SUMATRA_CREATE_PARAMS* params) 
    62596544{ 
    62606545    WindowInfo* pdfWin; 
    62616546    gRunningDLL = true; 
     
    62616546    gRunningDLL = true; 
    62626547    HINSTANCE hInstance = NULL; 
    62636548    HINSTANCE hPrevInstance = NULL; 
    6264     int nCmdShow = 0; 
     6549    int nCmdShow = 0; 
     6550    bool windowless=params && params->pHandle == NULL; 
    62656551 
    6266     StrList *           argListRoot = NULL; 
    6267     StrList *           currArg = NULL; 
    6268     MSG                 msg = {0}; 
    6269     bool                exitOnPrint = false; 
    6270     bool                printToDefaultPrinter = false; 
     6552    memset(&gCreateParams,0,sizeof(SUMATRA_CREATE_PARAMS)); 
     6553    if(params) 
     6554    { 
     6555        gCreateParams.pHandle=params->pHandle; 
     6556        gCreateParams.bSelection=params->bSelection; 
     6557        gCreateParams.cbRepaint=params->cbRepaint; 
     6558        gCreateParams.cbPageChanged=params->cbPageChanged; 
     6559        gCreateParams.cbSetScrollbarsSize=params->cbSetScrollbarsSize; 
     6560        gCreateParams.cbSetCursor=params->cbSetCursor; 
     6561    } 
    62716562 
    62726563    SerializableGlobalPrefs_Init(); 
    62736564 
     
    62756566 
    62766567    u_DoAllTests(); 
    62776568 
    6278     INITCOMMONCONTROLSEX cex; 
    6279     cex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
    6280     cex.dwICC = ICC_WIN95_CLASSES | ICC_DATE_CLASSES | ICC_USEREX_CLASSES | ICC_COOL_CLASSES; 
    6281     InitCommonControlsEx(&cex); 
    6282     argListRoot = NULL; 
     6569    //INITCOMMONCONTROLSEX cex; 
     6570    //cex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
     6571    //cex.dwICC = ICC_WIN95_CLASSES | ICC_DATE_CLASSES | ICC_USEREX_CLASSES | ICC_COOL_CLASSES; 
     6572    //InitCommonControlsEx(&cex); 
    62836573 
    6284     LoadString(hInstance, IDS_APP_TITLE, windowTitle, MAX_LOADSTRING); 
    6285  
    6286     if (!RegisterWinClass(hInstance)) 
    6287         Sumatra_Exit(); 
     6574    if(!windowless && !RegisterWinClass(hInstance)) Sumatra_Exit(); 
    62886575 
    62896576    CaptionPens_Create(); 
    62906577 
    6291     if (!InstanceInit(hInstance, nCmdShow)) 
    6292         Sumatra_Exit(); 
     6578    if (!InstanceInit(hInstance, nCmdShow)) Sumatra_Exit(); 
    62936579 
    62946580    CreatePageRenderThread(); 
    62956581 
    6296     bool reuseExistingWindow = false; 
    6297  
    6298     if (pHandle == 0 )  
    6299         pHandle = NULL; 
     6582    pdfWin = CreateEmpty(params?params->pHandle:NULL); 
    63006583 
    6301     pdfWin = CreateEmpty(pHandle); 
     6584    //add to list now, otherwise crashes occur if no page is loaded 
     6585    if(!windowless) WindowInfoList_Add(pdfWin); 
    63026586 
    63036587    return pdfWin; 
    63046588} 
     
    63126596    DeleteObject(gBrushLinkDebug); 
    63136597    delete globalParams; 
    63146598} 
     6599 
     6600HWND Sumatra_GetHwndCanvas(WindowInfo* pdfWin) 
     6601{return pdfWin->hwndCanvas;} 
  • src/SumatraPDF.h

    old new  
    107107        memzero(&animState, sizeof(animState)); 
    108108        memzero(&selectionRect, sizeof(selectionRect)); 
    109109    } 
    110     void GetCanvasSize() {  
    111         GetClientRect(hwndCanvas, &m_canvasRc); 
     110   void GetCanvasSize() {  
     111        if(hwndCanvas) GetClientRect(hwndCanvas, &m_canvasRc); 
    112112    } 
    113113    int winDx() { return rect_dx(&m_canvasRc); } 
    114114    int winDy() { return rect_dy(&m_canvasRc); } 
     
    189189    RECT m_frameRc; 
    190190    RECT m_canvasRc; 
    191191}; 
    192 #endif 
     192 
     193typedef struct { 
     194    HWND        pHandle;                                        //parent. NULL means windowless mode 
     195    int         bSelection;                                     //allow selection 
     196    int         (CALLBACK *cbPageChanged)(WindowInfo*);                     //notify our DLL when page is changed instead of doing the normal logic 
     197    void        (CALLBACK *cbRepaint)(WindowInfo*,int now);                     //the display needs to be repainted 
     198    void        (CALLBACK *cbSetScrollbarsSize)(WindowInfo*,int,int,int,int,unsigned int);          //this is for windowless mode 
     199    void        (CALLBACK *cbSetCursor)(WindowInfo*,int); //1: arrow, 2: hand, 3: drag 
     200    //todo:     CALLBACK cbHandleLink 
     201} SUMATRA_CREATE_PARAMS; 
    193202 
    194203#define SUMATRAPDF_API __declspec(dllexport) 
    195204extern "C" { 
    196     SUMATRAPDF_API void Sumatra_LoadPDF(WindowInfo* pdfWin, const char *pdfFile); 
     205    SUMATRAPDF_API void Sumatra_LoadPDF(WindowInfo* pdfWin, const char *pdfFile, unsigned int size); 
    197206    SUMATRAPDF_API void Sumatra_Print(WindowInfo* pdfWin); 
    198207    SUMATRAPDF_API void Sumatra_PrintPDF(WindowInfo* pdfWin, const char *pdfFile, long showOptionWindow); 
    199208    SUMATRAPDF_API void Sumatra_SetDisplayMode(WindowInfo* pdfWin, long displayMode); 
     209    SUMATRAPDF_API long Sumatra_GetDisplayMode(WindowInfo* pdfWin); 
    200210    SUMATRAPDF_API long Sumatra_GoToNextPage(WindowInfo* pdfWin);  
    201211    SUMATRAPDF_API long Sumatra_GoToPreviousPage(WindowInfo* pdfWin);  
    202212    SUMATRAPDF_API long Sumatra_GoToFirstPage(WindowInfo* pdfWin);  
     
    208218    SUMATRAPDF_API long Sumatra_ZoomOut(WindowInfo* pdfWin);  
    209219    SUMATRAPDF_API long Sumatra_SetZoom(WindowInfo* pdfWin, long zoomValue);  
    210220    SUMATRAPDF_API long Sumatra_GetCurrentZoom(WindowInfo* pdfWin);  
    211     SUMATRAPDF_API void Sumatra_Resize(WindowInfo* pdfWin); 
     221    SUMATRAPDF_API void Sumatra_Resize(WindowInfo* pdfWin, int nWidth, int nHeight); 
    212222    SUMATRAPDF_API void Sumatra_ClosePdf(WindowInfo* pdfWin); 
    213223    SUMATRAPDF_API void Sumatra_ShowPrintDialog(WindowInfo* pdfWin); 
    214     SUMATRAPDF_API WindowInfo* Sumatra_Init(HWND parentHandle); 
     224    SUMATRAPDF_API WindowInfo* Sumatra_Init(SUMATRA_CREATE_PARAMS*); 
    215225    SUMATRAPDF_API void Sumatra_Exit(); 
     226    SUMATRAPDF_API HWND Sumatra_GetHwndCanvas(WindowInfo* pdfWin); 
     227    SUMATRAPDF_API void Sumatra_Render(WindowInfo *win, HDC hdc,int x,int y,int w,int h); 
     228    SUMATRAPDF_API void Sumatra_ScrollY(WindowInfo *win,int type,int pos); 
     229    SUMATRAPDF_API void Sumatra_ScrollX(WindowInfo *win,int type,int pos); 
     230    SUMATRAPDF_API void Sumatra_MouseMove(WindowInfo *win,int x,int y,unsigned int flags); 
     231    SUMATRAPDF_API void Sumatra_MouseLeftDown(WindowInfo *win,int x,int y,unsigned int flags); 
     232    SUMATRAPDF_API void Sumatra_MouseLeftUp(WindowInfo *win,int x,int y,unsigned int flags); 
    216233} 
     234 
     235#endif 
Note: See TracBrowser for help on using the browser.