diff --git a/include/printer.cpp b/include/printer.cpp index a765c9f01..3a5fe1394 100755 --- a/include/printer.cpp +++ b/include/printer.cpp @@ -218,11 +218,12 @@ void TPrint_intersector::clear() struct PrDesc { TTextfile *_txt; - PRINT_RCD *_prcd; - bool _graphics; - int _formlen; - int _charsize; - int _lines_per_inch; +// PRINT_RCD *_prcd; +// bool _graphics; +// int _formlen; +// int _charsize; +// int _lines_per_inch; + TPrinter * _p; } PrintWhat; @@ -250,9 +251,61 @@ BOOLEAN XVT_CALLCONV1 TPrinter::start_winprint (long data) { PrDesc *pd = (PrDesc *) data; TTextfile& txt = *(pd->_txt); - TPrintwin pw(txt); - pw.do_print(); - return pw.aborted(); + const int vofs = pd->_p->get_line_offset(); + const int hofs = pd->_p->get_column_offset(); + + if (pd->_p->is_generic() && (vofs != 0 || hofs != 0)) + { + TTextfile new_txt; + TString s(256); + const long last_row = txt.lines(); + long out_row = 0; + + for (long row = (vofs < 0 ? -vofs : 0); row < last_row; row++) + { + const int pagelen = pd->_p->formlen(); + const int page_row = (int) (out_row % pagelen); + + if (vofs > 0 && page_row == 0) + { + const int page = (int) (out_row / pagelen); + + for (int i = vofs; i > 0; i--) + { + out_row++; + if (page > 0) + row++; + new_txt.append(""); + } + } + if (vofs < 0 && page_row == pagelen + vofs) + { + for (int i = -vofs; i > 0; i--) + { + out_row++; + row++; + new_txt.append(""); + } + } + s = txt.line(row); + if (hofs < 0) + s.ltrim(-hofs); + else + if(hofs > 0) + s.lpad(s.len() + hofs); + new_txt.append(s); + out_row++; + } + TPrintwin pw(new_txt); + pw.do_print(); + return pw.aborted(); + } + else + { + TPrintwin pw(txt); + pw.do_print(); + return pw.aborted(); + } } #endif @@ -2006,10 +2059,11 @@ void TPrinter::print_txt(TTextfile& txt) #if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 if (txt.lines() > 0) { - PrintWhat._prcd = _print_rcd; +// PrintWhat._prcd = _print_rcd; PrintWhat._txt = &txt; - PrintWhat._graphics = _isgraphics; - PrintWhat._charsize = _ch_size; +// PrintWhat._graphics = _isgraphics; +// PrintWhat._charsize = _ch_size; + PrintWhat._p = this; xvt_print_open(); xvt_print_start_thread (start_winprint, (long) (&PrintWhat)); xvt_print_close(); diff --git a/include/printwin.cpp b/include/printwin.cpp index f8c12162e..963297f2c 100755 --- a/include/printwin.cpp +++ b/include/printwin.cpp @@ -222,17 +222,10 @@ void TPrintwin::paint_row(long j) { _frlc++; xvt_dwin_draw_text(win(), 0, y , "", -1); - } + } else - if (_blank_lines_to_print > 0) - { - _frlc++; - xvt_dwin_draw_text(win(), 0, y , "", -1); - _blank_lines_to_print--; - } - else #endif - xvt_dwin_draw_text(win(), 0, y /* + _frlc_cnst */, (char*)(const char*)_txt.line(j - _frlc), -1); + xvt_dwin_draw_text(win(), 0, y /* + _frlc_cnst */, (char*)(const char*)_txt.line(j - _frlc), -1); } } @@ -249,42 +242,23 @@ bool TPrintwin::print_band( { // int i,l_ofst = printer().get_line_offset(); // const int offset = l_ofst < 0 ? abs(l_ofst) + 1: 0; - const int offset = printer().get_line_offset(); - const bool generic = _chary == 1; +// const int offset = printer().get_line_offset(); +// const bool generic = _chary == 1; const long j = ((long)page) * _formlen; const int rows = (r.bottom - r.top) / _chary; - const int top = r.top / _chary; - + const int top = r.top / _chary; + for (int k = top; k < top+rows; k++) { - if (generic && k < _formlen && (j + k) % _pagelen == 0) - { - if (offset < 0) - _frlc += offset; - else - { - if ((j + k) / _pagelen > 0) - _frlc -= offset; - _blank_lines_to_print += offset; - } - } - if ((j+k) < _txt.lines() + _frlc && k < _formlen || _blank_lines_to_print > 0) - paint_row(j+k); + long row = j + k; + + if (row < _txt.lines() + _frlc && k < _formlen) + paint_row(row); else break; - if (generic && offset < 0 && (j + k + 1) % _pagelen == 0) - { - if (k + 1 < _realformlen) - _blank_lines_to_print += abs(offset); - else - break; - } } - if (generic && offset < 0 && (j + k + 1) % _pagelen == 0) - _blank_lines_to_print += abs(offset); - const bool cont = (j+k < _txt.lines() + _frlc) || _blank_lines_to_print > 0; - return cont; + return (j + k < _txt.lines() + _frlc); } // @doc INTERNAL