void write(VA ptr, char value) { preparePage(pageVA(ptr)); memory[pageTable[pageVA(ptr)].offset + offsetVA(ptr)] = value; }
char read(VA ptr) { preparePage(pageVA(ptr)); return memory[pageTable[pageVA(ptr)].offset + offsetVA(ptr)]; }
void KCPageManager::layoutPages() { const KCSheet* sheet = d->sheet; const KCPrintSettings settings = d->settings; d->pages.clear(); clearPages(); int pageNumber = 1; preparePage(pageNumber); if (settings.pageOrder() == KCPrintSettings::LeftToRight) { // kDebug() << "processing printRanges" << settings.printRegion(); // iterate over the print ranges KCRegion::ConstIterator end = settings.printRegion().constEnd(); for (KCRegion::ConstIterator it = settings.printRegion().constBegin(); it != end; ++it) { if (!(*it)->isValid()) continue; // limit the print range to the used area const QRect printRange = (*it)->rect() & sheet->usedArea(true); // kDebug() << "processing printRange" << printRange; int rows = 0; double height = 0.0; for (int row = printRange.top(); row <= printRange.bottom(); ++row) { rows++; height += sheet->rowFormat(row)->visibleHeight(); // 1. find the number of rows per page if (row == printRange.bottom()) // always iterate over the last 'page row' ; else if (height + sheet->rowFormat(row + 1)->visibleHeight() <= size(pageNumber).height()) continue; // kDebug() << "1. done: row" << row << "rows" << rows << "height" << height; int columns = 0; double width = 0.0; // 2. iterate over the columns and create the pages for (int col = printRange.left(); col < printRange.right(); ++col) { columns++; width += sheet->columnFormat(col)->visibleWidth(); // Does the next column fit too? if (width + sheet->columnFormat(col + 1)->visibleWidth() <= size(pageNumber).width()) continue; // kDebug() << "col" << col << "columns" << columns << "width" << width; const QRect cellRange(col - columns + 1, row - rows + 1, columns, rows); if (pageNeedsPrinting(cellRange)) { d->pages.append(cellRange); insertPage(pageNumber++); preparePage(pageNumber); // prepare the next page } columns = 0; width = 0.0; } // Always insert a page for the last column columns++; const QRect cellRange(printRange.right() - columns + 1, row - rows + 1, columns, rows); if (pageNeedsPrinting(cellRange)) { d->pages.append(cellRange); insertPage(pageNumber); pageNumber++; } // 3. prepare for the next row of pages if (row != printRange.bottom()) { preparePage(pageNumber); } rows = 0; height = 0.0; } } } else { // if (settings.pageOrder() == KCPrintSettings::TopToBottom) // kDebug() << "processing printRanges" << settings.printRegion(); // iterate over the print ranges KCRegion::ConstIterator end = settings.printRegion().constEnd(); for (KCRegion::ConstIterator it = settings.printRegion().constBegin(); it != end; ++it) { if (!(*it)->isValid()) continue; // limit the print range to the used area const QRect printRange = (*it)->rect() & sheet->usedArea(); kDebug() << "processing printRange" << printRange; int columns = 0; double width = 0.0; for (int col = printRange.left(); col <= printRange.right(); ++col) { columns++; width += sheet->columnFormat(col)->visibleWidth(); // 1. find the number of columns per page if (col == printRange.right()) // always iterate over the last 'page column' ; else if (width + sheet->columnFormat(col + 1)->visibleWidth() <= size(pageNumber).width()) continue; // kDebug() << "1. done: col" << col << "columns" << columns << "width" << width; int rows = 0; double height = 0.0; // 2. iterate over the rows and create the pages for (int row = printRange.top(); row < printRange.bottom(); ++row) { rows++; height += sheet->rowFormat(row)->visibleHeight(); // Does the next row fit too? if (height + sheet->rowFormat(row + 1)->visibleHeight() <= size(pageNumber).height()) continue; // kDebug() << "row" << row << "rows" << rows << "height" << height; const QRect cellRange(col - columns + 1, row - rows + 1, columns, rows); if (pageNeedsPrinting(cellRange)) { d->pages.append(cellRange); insertPage(pageNumber++); preparePage(pageNumber); // prepare the next page } rows = 0; height = 0.0; } // Always insert a page for the last row rows++; const QRect cellRange(col - columns + 1, printRange.bottom() - rows + 1, columns, rows); if (pageNeedsPrinting(cellRange)) { d->pages.append(cellRange); insertPage(pageNumber); pageNumber++; } // 3. prepare for the next column of pages if (col != printRange.right()) { preparePage(pageNumber); } columns = 0; width = 0.0; } } } kDebug() << d->pages.count() << "page(s) created"; }