Changeset 86 for trunk/Lucide


Ignore:
Timestamp:
Jul 24, 2006, 5:57:42 PM (15 years ago)
Author:
Eugene Romanenko
Message:

drawing fixes and improvements, djvu plugin fixes

Location:
trunk/Lucide/SOURCE
Files:
4 edited

Legend:

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

    r83 r86  
    6464#define LINE_HEIGHT     16
    6565#define BORDER_COLOR    0x909090L
     66#define PAGEBACK_COLOR  0xFFFFFFL
     67#define VERT_SPACE      2
    6668
    6769// DocumentViewer constructor
     
    233235    {
    234236        doc->getPageSize( ev, i, &pagesizes[i].x, &pagesizes[i].y );
    235         if ( ( rotation == 90 ) || ( rotation == 270 ) ) {
     237        if ( isRotated() ) {
    236238            double tmp = pagesizes[i].x;
    237239            pagesizes[i].x = pagesizes[i].y;
     
    239241        }
    240242        fullwidth = __max( fullwidth, pagesizes[i].x );
    241         fullheight += pagesizes[i].y;
     243        fullheight += ( pagesizes[i].y + VERT_SPACE );
    242244    }
    243245}
     
    584586        fullwidth *= realzoom;
    585587        fullheight *= realzoom;
     588        fullheight += ( VERT_SPACE * totalpages );
    586589    }
    587590}
     
    640643    sVscrollInc = __max( -sVscrollPos * VScrollStep, __min( sVscrollInc,
    641644                              ( sVscrollMax - sVscrollPos ) * VScrollStep ) );
    642 
     645    sVscrollInc = ( sVscrollInc / VScrollStep ) * VScrollStep;
    643646    if ( sVscrollInc != 0 )
    644647    {
     
    887890}
    888891
    889 // handles WM_PAINT if singlepage asynchronous rendering used
     892// handles WM_PAINT if single-page asynchronous rendering used
    890893// posts events to drawthread
    891894void DocumentViewer::wmPaintAsynch( HWND hwnd )
    892895{
     896    LONG xPos = 0, yPos = 0;
     897    RECTL rclPage = { 0 };
    893898    RECTL rcl;
    894899    HPS hps = WinBeginPaint( hwnd, 0L, &rcl );
    895900    GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
    896901    WinFillRect( hpsBuffer, &rcl, BORDER_COLOR );
     902    if ( doc != NULL )
     903    {
     904        if ( width < cxClient ) {
     905            xPos = ( cxClient - width ) / 2;
     906        }
     907        if ( height < cyClient ) {
     908            yPos = ( cyClient - height ) / 2;
     909        }
     910
     911        rclPage.xLeft   = xPos;
     912        rclPage.yBottom = yPos;
     913        rclPage.xRight  = width + xPos;
     914        rclPage.yTop    = height + yPos;
     915        WinFillRect( hpsBuffer, &rclPage, PAGEBACK_COLOR );
     916    }
    897917    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
    898918    WinEndPaint( hps );
     
    900920    if ( doc != NULL )
    901921    {
    902         LONG xPos = 0, yPos = 0;
    903         if ( width < cxClient ) {
    904             xPos = ( cxClient - width ) / 2;
    905         }
    906         if ( height < cyClient ) {
    907             yPos = ( cyClient - height ) / 2;
    908         }
    909 
    910         RECTL rclPage = { xPos, yPos, width + xPos, height + yPos };
    911922        RECTL rclDraw = { 0 };
    912923        if ( WinIntersectRect( hab, &rclDraw, &rcl, &rclPage ) )
     
    966977    GpiCreateLogColorTable( hpsBuffer, 0, LCOLF_RGB, 0, 0, NULL );
    967978    WinFillRect( hpsBuffer, &rcl, BORDER_COLOR );
     979
     980    if ( doc != NULL )
     981    {
     982        long foundpage = -1;
     983        double pageRest;
     984        for ( LONG i = rcl.yTop; i >= rcl.yBottom; i-- )
     985        {
     986            pageRest = 0;
     987            long pg = posToPagenum( i, &pageRest );
     988            if ( ( pg != foundpage ) && ( pg != -1 ) )
     989            {
     990                RECTL rclPage = { 0 };
     991                LuRectangle lr = { 0, 0,
     992                    isRotated() ? (pagesizes[ pg ].y - 1) : (pagesizes[ pg ].x - 1),
     993                    isRotated() ? (pagesizes[ pg ].x - 1) : (pagesizes[ pg ].y - 1) };
     994                docPosToWinPos( pg, &lr, &rclPage );
     995                WinFillRect( hpsBuffer, &rclPage, PAGEBACK_COLOR );
     996                foundpage = pg;
     997                i -= pageRest;
     998            }
     999        }
     1000    }
     1001
    9681002    BlitGraphicsBuffer( hps, hpsBuffer, &rcl );
    9691003    WinEndPaint( hps );
     
    10841118{
    10851119    double yPos = ( cyClient - yPosWin ) + ( sVscrollPos * VScrollStep );
     1120    double pgstart = 0;
    10861121    double pgend = 0;
    10871122    for ( long i = 0; i < totalpages; i++ )
    10881123    {
    1089         pgend += ( pagesizes[ i ].y * realzoom );
    1090         if ( yPos < pgend ) {
     1124        pgend = pgstart + ( pagesizes[ i ].y * realzoom );
     1125        if ( ( yPos >= pgstart ) && ( yPos < pgend ) ) {
    10911126            *pageRest = pgend - yPos;
    10921127            return i;
    10931128        }
    1094     }
    1095     return 0;
     1129        pgstart = ( pgend + VERT_SPACE );
     1130    }
     1131    return -1;
    10961132}
    10971133
     
    11041140        ypos += pagesizes[ i ].y;
    11051141    }
    1106     return ypos * realzoom;
     1142    return ( ( ypos * realzoom ) + ( pagenum * VERT_SPACE ) );
    11071143}
    11081144
     
    11201156            pageRest = 0;
    11211157            long pg = posToPagenum( i, &pageRest );
    1122             if ( pg != foundpage )
     1158            if ( ( pg != foundpage ) && ( pg != -1 ) )
    11231159            {
    11241160                double w = pagesizes[ pg ].x * realzoom;
    11251161
    1126                 PageDrawArea pda;
     1162                PageDrawArea pda = {0};
    11271163                pda.pagenum = pg;
    11281164
     
    11321168                }
    11331169                RECTL rclPage = { 0 };
    1134                 LuRectangle lr = { 0, 0, pagesizes[ pg ].x, pagesizes[ pg ].y };
     1170                LuRectangle lr = { 0, 0,
     1171                    isRotated() ? (pagesizes[ pg ].y - 1) : (pagesizes[ pg ].x - 1),
     1172                    isRotated() ? (pagesizes[ pg ].x - 1) : (pagesizes[ pg ].y - 1) };
    11351173                docPosToWinPos( pg, &lr, &rclPage );
    1136                 RECTL rclDraw = { 0 };
    1137                 if ( WinIntersectRect( hab, &rclDraw, r, &rclPage ) )
     1174                if ( WinIntersectRect( hab, &pda.drawrect, r, &rclPage ) )
    11381175                {
    1139                     pda.drawrect.xLeft   = __min( w + xPos, rclDraw.xLeft );
    1140                     pda.drawrect.yBottom = __max( i - pageRest, rclDraw.yBottom );
    1141                     pda.drawrect.xRight  = __min( w + xPos, rclDraw.xRight );
    1142                     pda.drawrect.yTop    = i;
    1143 
    11441176                    pda.startpos.x = sHscrollPos + pda.drawrect.xLeft - xPos;
    11451177                    pda.startpos.y = ( pagesizes[ pg ].y * realzoom ) - pageRest;
    1146 
    11471178                    areas->push_back( pda );
    11481179                }
     
    15871618        }
    15881619
    1589         if ( links[ pg ] != NULL )
     1620        if ( ( pg != -1 ) && ( links[ pg ] != NULL ) )
    15901621        {
    15911622            for ( int i = 0; i < links[ pg ]->_length; i++ )
     
    16191650    }
    16201651
    1621     if ( links[ pg ] != NULL )
     1652    if ( ( pg != -1 ) && ( links[ pg ] != NULL ) )
    16221653    {
    16231654        for ( int i = 0; i < links[ pg ]->_length; i++ )
  • trunk/Lucide/SOURCE/gui/docViewer.h

    r72 r86  
    118118        long posToPagenum( LONG yPosWin, double *pageRest );
    119119        double pagenumToPos( long pagenum );
     120        bool isRotated() { return ( (rotation==90) || (rotation==270) ); }
    120121
    121122        static MRESULT EXPENTRY docViewProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
  • trunk/Lucide/SOURCE/gui/lucide.cpp

    r85 r86  
    129129    WinSendMsg( hToolBar, TBM_ENABLEITEM, MPFROMSHORT(CM_LASTPAGE), (MPARAM)enlast );
    130130
     131    bool tmp = dontSwitchPage;
     132    dontSwitchPage = true;
    131133    WinSendDlgItemMsg( hToolBar, TBID_PAGENUM, SPBM_SETCURRENTVALUE,
    132134                       MPFROMLONG( docViewer->getCurrentPage() + 1 ), MPVOID );
     135    dontSwitchPage = tmp;
    133136    indexWin->goToPage( NULL, docViewer->getCurrentPage() );
    134137}
  • trunk/Lucide/SOURCE/plugins/ludjvu/ludjvu.cpp

    r84 r86  
    3737
    3838#include "ludjvu.xih"
     39#ifdef __WATCOMC__
    3940#include <ddjvuapiw.h>
    40 
     41#else
     42#include <ddjvuapi.h>
     43#endif
    4144
    4245#define SCALE_FACTOR 0.2
     
    7679}
    7780
     81
     82static void djvu_handle_events( ddjvu_context_t *ctx )
     83{
     84    const ddjvu_message_t *msg;
     85
     86    if ( ctx == NULL ) {
     87        return;
     88    }
     89
     90    msg = ddjvu_message_wait( ctx );
     91    while ( ( msg = ddjvu_message_peek( ctx ) ) )
     92    {
     93        switch ( msg->m_any.tag )
     94        {
     95            case DDJVU_ERROR:
     96                // TODO: error message
     97            default:
     98                break;
     99        }
     100        ddjvu_message_pop( ctx );
     101    }
     102}
     103
    78104SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
    79105                                     Environment *ev, string filename,
     
    97123
    98124    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
    99         ddjvu_message_wait( d->d_context );
    100         ddjvu_message_pop( d->d_context );
     125        djvu_handle_events( d->d_context );
    101126    }
    102127
     
    133158
    134159    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
    135         ddjvu_message_wait( d->d_context );
    136         ddjvu_message_pop( d->d_context );
     160        djvu_handle_events( d->d_context );
    137161    }
    138162
     
    167191
    168192    while ( !ddjvu_page_decoding_done( d_page ) ) {
    169         ddjvu_message_wait( d->d_context );
    170         ddjvu_message_pop( d->d_context );
     193        djvu_handle_events( d->d_context );
    171194    }
    172195
     
    189212    LuPixbuf *pb = new LuPixbuf( ev, prect.w, prect.h, bpp );
    190213    long pb_rowsize = pb->getRowSize( ev );
     214    long pb_height = pb->getHeight( ev );
    191215    char *pbbuf = (char *)pb->getDataPtr( ev );
    192216    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
     
    196220    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
    197221    char *src, *dst;
    198     int i, y, linesize = __min( pb_rowsize, pixbuf_rowsize );
    199     for ( y = (src_height-1), i = 0; i < src_height; y--, i++ )
     222    int i, y;
     223    int rowsize = __min( pb_rowsize, pixbuf_rowsize );
     224    int height = __min( pb_height, pixbuf_height );
     225    for ( y = (height-1), i = 0; i < height; y--, i++ )
    200226    {
    201227        src = pbbuf + (y * pb_rowsize);
    202228        dst = pixbuf_data + (i * pixbuf_rowsize);
    203         memcpy( dst, src, linesize );
     229        memcpy( dst, src, rowsize );
    204230    }
    205231    delete pb;
     
    236262
    237263    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
    238             ddjvu_message_wait( d->d_context );
    239             ddjvu_message_pop( d->d_context );
     264        djvu_handle_events( d->d_context );
    240265    }
    241266
Note: See TracChangeset for help on using the changeset viewer.