Ignore:
Timestamp:
Jun 11, 2006, 4:12:09 PM (15 years ago)
Author:
Eugene Romanenko
Message:

added settings dialog, asynch opening, fixed many crashes and bugs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Lucide/SOURCE/gui/docViewer.cpp

    r40 r50  
    5858}
    5959
     60ULONG APIENTRY GPFHandler( PEXCEPTIONREPORTRECORD pxcptrec,
     61                           PEXCEPTIONREGISTRATIONRECORD prr,
     62                           PCONTEXTRECORD pcr, PVOID pv );
     63
     64
    6065typedef LuDocument_LuRectSequence    *PLuRectSequence;
    6166typedef LuDocument_LuLinkMapSequence *PLuLinkMapSequence;
     
    96101    drawareas   = NULL;
    97102    drawareaIndex = 0;
     103    closed        = true;
    98104    // continuous view
    99105    continuous  = false;
     
    181187    if ( doc != NULL )
    182188    {
     189        closed = false;
     190
    183191        totalpages = doc->getPageCount( ev );
    184192        bpp = doc->getBpp( ev );
     193        if ( !doc->isScalable( ev ) ) {
     194            zoom = 1;
     195        }
    185196
    186197        pagesizes = new LuSize[ totalpages ];
     
    205216        enableAsynchDraw = doc->isAsynchRenderingSupported( ev );
    206217        goToPage( 0 );
     218
     219        if ( continuous ) {
     220            drawPage();
     221        }
    207222    }
    208223}
     
    212227void DocumentViewer::close()
    213228{
     229    if ( closed ) {
     230        return;
     231    }
     232
     233    closed = true;
    214234    abortAsynch = true;
    215235    DosRequestMutexSem( todrawAccess, SEM_INDEFINITE_WAIT );
     
    236256    doc         = NULL;
    237257    totalpages  = 0;
    238     zoom        = 1;
    239258    currentpage = 0;
    240259    fullwidth   = 0;
     
    244263}
    245264
    246 // sets the view mode
    247 void DocumentViewer::setViewMode( ViewMode mode )
    248 {
    249     continuous = ( mode == Continuous );
     265// sets the page layout
     266void DocumentViewer::setPageLayout( PgLayout layout )
     267{
     268    continuous = ( layout == Continuous );
    250269    if ( doc != NULL ) {
    251270        long pg = currentpage;
     
    294313        double pgpos = pagenumToPos( page ) / VScrollStep;
    295314        vertScroll( hWndDoc, MPFROM2SHORT( pgpos, SB_SLIDERPOSITION ), NULLHANDLE );
    296         //drawPage();
    297315    }
    298316    else
     
    755773        }
    756774    }
    757 
    758775    WinDestroyMsgQueue( thmq );
    759776    WinTerminate( thab );
     
    767784    RECTL rcl;
    768785    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    769     if ( hps != NULLHANDLE )
    770     {
    771         RECTL rclWin = { 0 };
    772         WinQueryWindowRect( hwnd, &rclWin );
    773         if ( WinEqualRect( hab, &rcl, &rclWin ) ) {
    774             GpiErase( hps );
    775         }
    776         WinEndPaint( hps );
    777     }
    778 
    779     RECTL rclPage = { 0, 0, width, height };
    780     if ( height < cyClient )
    781     {
    782         rclPage.yBottom = cyClient - height;
    783         rclPage.yTop = cyClient;
    784     }
    785     RECTL rclDraw = { 0 };
    786     if ( WinIntersectRect( hab, &rclDraw, &rcl, &rclPage ) )
    787     {
    788         if ( ( drawareas != NULL ) && ( drawareas->size() > 0 ) ) {
    789             if ( isSubrect( &((*drawareas)[0].drawrect), &rclDraw ) &&
    790                  ( sVscrollInc == 0 ) && ( sHscrollInc == 0 ) ) {
    791                 return;
    792             }
     786    RECTL rclWin = { 0 };
     787    WinQueryWindowRect( hwnd, &rclWin );
     788    if ( WinEqualRect( hab, &rcl, &rclWin ) ) {
     789        GpiErase( hps );
     790    }
     791    WinEndPaint( hps );
     792
     793    if ( doc != NULL )
     794    {
     795        RECTL rclPage = { 0, 0, width, height };
     796        if ( height < cyClient )
     797        {
     798            rclPage.yBottom = cyClient - height;
     799            rclPage.yTop = cyClient;
     800        }
     801        RECTL rclDraw = { 0 };
     802        if ( WinIntersectRect( hab, &rclDraw, &rcl, &rclPage ) )
     803        {
     804            if ( ( drawareas != NULL ) && ( drawareas->size() > 0 ) ) {
     805                if ( isSubrect( &((*drawareas)[0].drawrect), &rclDraw ) &&
     806                     ( sVscrollInc == 0 ) && ( sHscrollInc == 0 ) ) {
     807                    return;
     808                }
     809            }
     810
     811            abortAsynch = true;
     812            DosRequestMutexSem( todrawAccess, SEM_INDEFINITE_WAIT );
     813
     814            if ( drawareas == NULL ) {
     815                drawareas = new DrawAreas;
     816            }
     817            if ( drawareas->size() == 0 ) {
     818                PageDrawArea pda;
     819                memset( &pda, 0, sizeof( pda ) );
     820                pda.pagenum = currentpage;
     821                drawareas->push_back( pda );
     822            }
     823
     824            PageDrawArea *ppda = &((*drawareas)[0]);
     825
     826            if ( !WinIsRectEmpty( hab, &ppda->drawrect ) )
     827            {
     828                if ( sVscrollInc > 0 ) {
     829                    ppda->drawrect.yTop    += sVscrollInc;
     830                } else if ( sVscrollInc < 0 ) {
     831                    ppda->drawrect.yBottom += sVscrollInc;
     832                }
     833                if ( sHscrollInc > 0 ) {
     834                    ppda->drawrect.xLeft  -= sHscrollInc;
     835                } else if ( sHscrollInc < 0 ) {
     836                    ppda->drawrect.xRight -= sHscrollInc;
     837                }
     838            }
     839            WinUnionRect( hab, &ppda->drawrect, &ppda->drawrect, &rclDraw );
     840            ppda->startpos.x = sHscrollPos + ppda->drawrect.xLeft;
     841            ppda->startpos.y = ( cyClient - ppda->drawrect.yTop ) + sVscrollPos;
     842
     843            // workaround ?
     844            ppda->drawrect.xRight++;
     845            ppda->drawrect.yTop++;
     846
     847            DosReleaseMutexSem( todrawAccess );
     848            DosPostEventSem( haveDraw );
     849        }
     850    }
     851}
     852
     853
     854// handles WM_PAINT if continuous asynchronous rendering used
     855void DocumentViewer::wmPaintContAsynch( HWND hwnd )
     856{
     857    RECTL rcl, rclWin, rclDraw = { 0 };
     858    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
     859    GpiErase( hpsBuffer );
     860    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
     861    WinEndPaint( hps );
     862
     863    if ( doc != NULL )
     864    {
     865        if ( isSubrect( &savedRcl, &rcl ) && ( sVscrollInc == 0 ) && ( sHscrollInc == 0 ) ) {
     866            return;
    793867        }
    794868
     
    796870        DosRequestMutexSem( todrawAccess, SEM_INDEFINITE_WAIT );
    797871
    798         if ( drawareas == NULL ) {
    799             drawareas = new DrawAreas;
    800         }
    801         if ( drawareas->size() == 0 ) {
    802             PageDrawArea pda;
    803             memset( &pda, 0, sizeof( pda ) );
    804             pda.pagenum = currentpage;
    805             drawareas->push_back( pda );
    806         }
    807 
    808         PageDrawArea *ppda = &((*drawareas)[0]);
    809 
    810         if ( !WinIsRectEmpty( hab, &ppda->drawrect ) )
    811         {
    812             if ( sVscrollInc > 0 ) {
    813                 ppda->drawrect.yTop    += sVscrollInc;
    814             } else if ( sVscrollInc < 0 ) {
    815                 ppda->drawrect.yBottom += sVscrollInc;
    816             }
    817             if ( sHscrollInc > 0 ) {
    818                 ppda->drawrect.xLeft  -= sHscrollInc;
    819             } else if ( sHscrollInc < 0 ) {
    820                 ppda->drawrect.xRight -= sHscrollInc;
    821             }
    822         }
    823         WinUnionRect( hab, &ppda->drawrect, &ppda->drawrect, &rclDraw );
    824         ppda->startpos.x = sHscrollPos + ppda->drawrect.xLeft;
    825         ppda->startpos.y = ( cyClient - ppda->drawrect.yTop ) + sVscrollPos;
    826 
    827         // workaround ?
    828         ppda->drawrect.xRight++;
    829         ppda->drawrect.yTop++;
    830 
     872        WinQueryWindowRect( hwnd, &rclWin );
     873        WinUnionRect( hab, &rcl, &rcl, &savedRcl );
     874
     875        if ( sVscrollInc > 0 ) {
     876            rcl.yTop    += sVscrollInc;
     877        } else if ( sVscrollInc < 0 ) {
     878            rcl.yBottom += sVscrollInc;
     879        }
     880        if ( sHscrollInc > 0 ) {
     881            rcl.xLeft  -= sHscrollInc;
     882        } else if ( sHscrollInc < 0 ) {
     883            rcl.xRight -= sHscrollInc;
     884        }
     885
     886        WinIntersectRect( hab, &rclDraw, &rcl, &rclWin );
     887        WinCopyRect( hab, &rcl, &rclDraw );
     888        WinCopyRect( hab, &savedRcl, &rcl );
     889
     890        delete drawareas;
     891        drawareas = findDrawAreas( &rcl );
     892
     893        for ( int i = 0; i < drawareas->size(); i++ )
     894        {
     895            PageDrawArea *pda = &(*drawareas)[ i ];
     896
     897            // load links for page if not loaded before
     898            if ( links[ pda->pagenum ] == NULL ) {
     899                links[ pda->pagenum ] = doc->getLinkMapping( ev, pda->pagenum );
     900            }
     901        }
    831902        DosReleaseMutexSem( todrawAccess );
    832903        DosPostEventSem( haveDraw );
    833     }
    834 }
    835 
    836 
    837 // handles WM_PAINT if continuous asynchronous rendering used
    838 void DocumentViewer::wmPaintContAsynch( HWND hwnd )
    839 {
    840     RECTL rcl, rclWin, rclDraw = { 0 };
    841     HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    842     if ( hps != NULLHANDLE ) {
    843         GpiErase( hpsBuffer );
    844         BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
    845         WinEndPaint( hps );
    846     }
    847 
    848     if ( isSubrect( &savedRcl, &rcl ) && ( sVscrollInc == 0 ) && ( sHscrollInc == 0 ) ) {
    849         return;
    850     }
    851 
    852     abortAsynch = true;
    853     DosRequestMutexSem( todrawAccess, SEM_INDEFINITE_WAIT );
    854 
    855     WinQueryWindowRect( hwnd, &rclWin );
    856     WinUnionRect( hab, &rcl, &rcl, &savedRcl );
    857 
    858     if ( sVscrollInc > 0 ) {
    859         rcl.yTop    += sVscrollInc;
    860     } else if ( sVscrollInc < 0 ) {
    861         rcl.yBottom += sVscrollInc;
    862     }
    863     if ( sHscrollInc > 0 ) {
    864         rcl.xLeft  -= sHscrollInc;
    865     } else if ( sHscrollInc < 0 ) {
    866         rcl.xRight -= sHscrollInc;
    867     }
    868 
    869     WinIntersectRect( hab, &rclDraw, &rcl, &rclWin );
    870     WinCopyRect( hab, &rcl, &rclDraw );
    871     WinCopyRect( hab, &savedRcl, &rcl );
    872 
    873     delete drawareas;
    874     drawareas = findDrawAreas( &rcl );
    875 
    876     for ( int i = 0; i < drawareas->size(); i++ )
    877     {
    878         PageDrawArea *pda = &(*drawareas)[ i ];
    879 
    880         // load links for page if not loaded before
    881         if ( links[ pda->pagenum ] == NULL ) {
    882             links[ pda->pagenum ] = doc->getLinkMapping( ev, pda->pagenum );
    883         }
    884     }
    885     DosReleaseMutexSem( todrawAccess );
    886     DosPostEventSem( haveDraw );
    887 
    888     determineCurrentPage();
     904
     905        determineCurrentPage();
     906    }
    889907}
    890908
     
    897915    GpiErase( hpsBuffer );
    898916
    899     RECTL rclPage = { 0, 0, width, height };
    900     if ( height < cyClient )
    901     {
    902         rclPage.yBottom = cyClient - height;
    903         rclPage.yTop = cyClient;
    904     }
    905     RECTL rclDraw = { 0 };
    906     if ( WinIntersectRect( hab, &rclDraw, &rcl, &rclPage ) )
    907     {
    908         spos_x = sHscrollPos + rclDraw.xLeft;
    909         spos_y = (cyClient - rclDraw.yTop) + sVscrollPos;
    910         LONG rclx = rclDraw.xRight - rclDraw.xLeft;
    911         LONG rcly = rclDraw.yTop - rclDraw.yBottom;
    912 
    913         pixbuf = new LuPixbuf( ev, rclx, rcly, bpp );
    914         POINTL aptlPoints[4]={ rclDraw.xLeft, rclDraw.yBottom,
    915                                rclDraw.xRight-1, rclDraw.yTop-1,
    916                                0, 0, rclx, rcly };
    917 
    918         doc->renderPageToPixbuf( ev, currentpage, spos_x, spos_y,
    919                                  rclx, rcly, realzoom, 0, pixbuf );
    920         LONG lRop = ROP_SRCCOPY;
    921         BITMAPINFO2 pbmi;
    922         pbmi.cbFix = 16L;
    923         pbmi.cx = rclx;
    924         pbmi.cy = rcly;
    925         pbmi.cPlanes = 1;
    926         pbmi.cBitCount = bpp * 8;
    927         GpiDrawBits( hpsBuffer, pixbuf->getDataPtr( ev ), &pbmi, 4L,
    928                      aptlPoints, lRop, BBO_IGNORE );
    929 
    930         drawSelection( currentpage, hpsBuffer, &rclDraw );
    931         drawFound( currentpage, hpsBuffer, &rclDraw );
    932 
     917    if ( doc != NULL )
     918    {
     919        RECTL rclPage = { 0, 0, width, height };
     920        if ( height < cyClient )
     921        {
     922            rclPage.yBottom = cyClient - height;
     923            rclPage.yTop = cyClient;
     924        }
     925        RECTL rclDraw = { 0 };
     926        if ( WinIntersectRect( hab, &rclDraw, &rcl, &rclPage ) )
     927        {
     928            spos_x = sHscrollPos + rclDraw.xLeft;
     929            spos_y = (cyClient - rclDraw.yTop) + sVscrollPos;
     930            LONG rclx = rclDraw.xRight - rclDraw.xLeft;
     931            LONG rcly = rclDraw.yTop - rclDraw.yBottom;
     932
     933            pixbuf = new LuPixbuf( ev, rclx, rcly, bpp );
     934            POINTL aptlPoints[4]={ rclDraw.xLeft, rclDraw.yBottom,
     935                                   rclDraw.xRight-1, rclDraw.yTop-1,
     936                                   0, 0, rclx, rcly };
     937
     938            doc->renderPageToPixbuf( ev, currentpage, spos_x, spos_y,
     939                                     rclx, rcly, realzoom, 0, pixbuf );
     940            LONG lRop = ROP_SRCCOPY;
     941            BITMAPINFO2 pbmi;
     942            pbmi.cbFix = 16L;
     943            pbmi.cx = rclx;
     944            pbmi.cy = rcly;
     945            pbmi.cPlanes = 1;
     946            pbmi.cBitCount = bpp * 8;
     947            GpiDrawBits( hpsBuffer, pixbuf->getDataPtr( ev ), &pbmi, 4L,
     948                         aptlPoints, lRop, BBO_IGNORE );
     949
     950            drawSelection( currentpage, hpsBuffer, &rclDraw );
     951            drawFound( currentpage, hpsBuffer, &rclDraw );
     952
     953            BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
     954            delete pixbuf;
     955            pixbuf = NULL;
     956        }
     957    }
     958    else {
    933959        BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
    934         delete pixbuf;
    935         pixbuf = NULL;
    936     }
    937 
     960    }
    938961    WinEndPaint( hps );
    939962}
     
    10381061    GpiErase( hpsBuffer );
    10391062
    1040     delete drawareas;
    1041     drawareas = findDrawAreas( &rcl );
    1042 
    1043     for ( int i = 0; i < drawareas->size(); i++ )
    1044     {
    1045         PageDrawArea *pda = &(*drawareas)[ i ];
    1046 
    1047         // load links for page if not loaded before
    1048         if ( links[ pda->pagenum ] == NULL ) {
    1049             links[ pda->pagenum ] = doc->getLinkMapping( ev, pda->pagenum );
    1050         }
    1051 
    1052         spos_x = pda->startpos.x;
    1053         //spos_y = ( cyClient - pda->drawrect.yTop ) + ( sVscrollPos * VScrollStep );
    1054         spos_y = pda->startpos.y;
    1055         LONG rclx = pda->drawrect.xRight - pda->drawrect.xLeft;
    1056         LONG rcly = pda->drawrect.yTop - pda->drawrect.yBottom;
    1057 
    1058         pixbuf = new LuPixbuf( ev, rclx, rcly, bpp );
    1059         POINTL aptlPoints[4]={ pda->drawrect.xLeft, pda->drawrect.yBottom,
    1060                                pda->drawrect.xRight-1, pda->drawrect.yTop-1,
    1061                                0, 0, rclx, rcly };
    1062 
    1063         doc->renderPageToPixbuf( ev, pda->pagenum, spos_x, spos_y,
    1064                                  rclx, rcly, realzoom, 0, pixbuf );
    1065         LONG lRop = ROP_SRCCOPY;
    1066         BITMAPINFO2 pbmi;
    1067         pbmi.cbFix = 16L;
    1068         pbmi.cx = rclx;
    1069         pbmi.cy = rcly;
    1070         pbmi.cPlanes = 1;
    1071         pbmi.cBitCount = bpp * 8;
    1072         GpiDrawBits( hpsBuffer, pixbuf->getDataPtr( ev ), &pbmi, 4L,
    1073                      aptlPoints, lRop, BBO_IGNORE );
    1074 
    1075         drawSelection( pda->pagenum, hpsBuffer, &pda->drawrect );
    1076         drawFound( pda->pagenum, hpsBuffer, &pda->drawrect );
    1077 
    1078         delete pixbuf;
    1079         pixbuf = NULL;
    1080     }
    1081     delete drawareas;
    1082     drawareas = NULL;
     1063    if ( doc != NULL )
     1064    {
     1065        delete drawareas;
     1066        drawareas = findDrawAreas( &rcl );
     1067
     1068        for ( int i = 0; i < drawareas->size(); i++ )
     1069        {
     1070            PageDrawArea *pda = &(*drawareas)[ i ];
     1071
     1072            // load links for page if not loaded before
     1073            if ( links[ pda->pagenum ] == NULL ) {
     1074                links[ pda->pagenum ] = doc->getLinkMapping( ev, pda->pagenum );
     1075            }
     1076
     1077            spos_x = pda->startpos.x;
     1078            //spos_y = ( cyClient - pda->drawrect.yTop ) + ( sVscrollPos * VScrollStep );
     1079            spos_y = pda->startpos.y;
     1080            LONG rclx = pda->drawrect.xRight - pda->drawrect.xLeft;
     1081            LONG rcly = pda->drawrect.yTop - pda->drawrect.yBottom;
     1082
     1083            pixbuf = new LuPixbuf( ev, rclx, rcly, bpp );
     1084            POINTL aptlPoints[4]={ pda->drawrect.xLeft, pda->drawrect.yBottom,
     1085                                   pda->drawrect.xRight-1, pda->drawrect.yTop-1,
     1086                                   0, 0, rclx, rcly };
     1087
     1088            doc->renderPageToPixbuf( ev, pda->pagenum, spos_x, spos_y,
     1089                                     rclx, rcly, realzoom, 0, pixbuf );
     1090            LONG lRop = ROP_SRCCOPY;
     1091            BITMAPINFO2 pbmi;
     1092            pbmi.cbFix = 16L;
     1093            pbmi.cx = rclx;
     1094            pbmi.cy = rcly;
     1095            pbmi.cPlanes = 1;
     1096            pbmi.cBitCount = bpp * 8;
     1097            GpiDrawBits( hpsBuffer, pixbuf->getDataPtr( ev ), &pbmi, 4L,
     1098                         aptlPoints, lRop, BBO_IGNORE );
     1099
     1100            drawSelection( pda->pagenum, hpsBuffer, &pda->drawrect );
     1101            drawFound( pda->pagenum, hpsBuffer, &pda->drawrect );
     1102
     1103            delete pixbuf;
     1104            pixbuf = NULL;
     1105        }
     1106        delete drawareas;
     1107        drawareas = NULL;
     1108    }
    10831109    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
    10841110    WinEndPaint( hps );
    10851111
    1086     determineCurrentPage();
     1112    if ( doc != NULL ) {
     1113        determineCurrentPage();
     1114    }
    10871115}
    10881116
Note: See TracChangeset for help on using the changeset viewer.