mirror of
https://github.com/geometer/FBReaderJ.git
synced 2025-10-04 10:19:33 +02:00
DocPlugin: support for images (also supporting for blocked images in ZLFileImage)
This commit is contained in:
parent
0abb1f46a6
commit
401aaba8bf
26 changed files with 1320 additions and 86 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2009-2010 Geometer Plus <contact@geometerplus.com>
|
||||
* Copyright (C) 2004-2012 Geometer Plus <contact@geometerplus.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -70,20 +70,17 @@ size_t OleStream::read(char *buffer, size_t maxSize) {
|
|||
|
||||
readedBytes = myBaseStream->read(buffer, std::min(length, bytesLeftInCurBlock));
|
||||
for (size_t i = 0; i < toReadBlocks; ++i) {
|
||||
size_t readbytes;
|
||||
++curBlockNumber;
|
||||
if (++curBlockNumber >= myOleEntry.blocks.size()) {
|
||||
break;
|
||||
}
|
||||
newFileOffset = myStorage->getFileOffsetOfBlock(myOleEntry, curBlockNumber);
|
||||
myBaseStream->seek(newFileOffset, true);
|
||||
readbytes = myBaseStream->read(buffer + readedBytes, std::min(length - readedBytes, sectorSize));
|
||||
readedBytes += readbytes;
|
||||
readedBytes += myBaseStream->read(buffer + readedBytes, std::min(length - readedBytes, sectorSize));
|
||||
}
|
||||
if (toReadBytes > 0) {
|
||||
size_t readbytes;
|
||||
++curBlockNumber;
|
||||
if (toReadBytes > 0 && ++curBlockNumber < myOleEntry.blocks.size()) {
|
||||
newFileOffset = myStorage->getFileOffsetOfBlock(myOleEntry, curBlockNumber);
|
||||
myBaseStream->seek(newFileOffset, true);
|
||||
readbytes = myBaseStream->read(buffer + readedBytes, toReadBytes);
|
||||
readedBytes += readbytes;
|
||||
readedBytes += myBaseStream->read(buffer + readedBytes, toReadBytes);
|
||||
}
|
||||
myOleOffset += readedBytes;
|
||||
return readedBytes;
|
||||
|
@ -125,3 +122,74 @@ bool OleStream::seek(unsigned int offset, bool absoluteOffset) {
|
|||
size_t OleStream::offset() {
|
||||
return myOleOffset;
|
||||
}
|
||||
|
||||
ZLFileImage::Blocks OleStream::getBlockPieceInfoList(unsigned int offset, unsigned int size) const {
|
||||
ZLFileImage::Blocks list;
|
||||
unsigned int sectorSize = (myOleEntry.isBigBlock ? myStorage->getSectorSize() : myStorage->getShortSectorSize());
|
||||
unsigned int curBlockNumber = offset / sectorSize;
|
||||
if (curBlockNumber >= myOleEntry.blocks.size()) {
|
||||
return list;
|
||||
}
|
||||
unsigned int modBlock = offset % sectorSize;
|
||||
unsigned int startFileOffset = myStorage->getFileOffsetOfBlock(myOleEntry, curBlockNumber) + modBlock;
|
||||
|
||||
unsigned int bytesLeftInCurBlock = sectorSize - modBlock;
|
||||
unsigned int toReadBlocks = 0, toReadBytes = 0;
|
||||
if (bytesLeftInCurBlock < size) {
|
||||
toReadBlocks = (size - bytesLeftInCurBlock) / sectorSize;
|
||||
toReadBytes = (size - bytesLeftInCurBlock) % sectorSize;
|
||||
}
|
||||
|
||||
unsigned int readedBytes = std::min(size, bytesLeftInCurBlock);
|
||||
list.push_back(ZLFileImage::Block(startFileOffset, readedBytes));
|
||||
|
||||
for (unsigned int i = 0; i < toReadBlocks; ++i) {
|
||||
if (++curBlockNumber >= myOleEntry.blocks.size()) {
|
||||
break;
|
||||
}
|
||||
unsigned int newFileOffset = myStorage->getFileOffsetOfBlock(myOleEntry, curBlockNumber);
|
||||
unsigned int readbytes = std::min(size - readedBytes, sectorSize);
|
||||
list.push_back(ZLFileImage::Block(newFileOffset, readbytes));
|
||||
readedBytes += readbytes;
|
||||
}
|
||||
if (toReadBytes > 0 && ++curBlockNumber < myOleEntry.blocks.size()) {
|
||||
unsigned int newFileOffset = myStorage->getFileOffsetOfBlock(myOleEntry, curBlockNumber);
|
||||
unsigned int readbytes = toReadBytes;
|
||||
list.push_back(ZLFileImage::Block(newFileOffset, readbytes));
|
||||
readedBytes += readbytes;
|
||||
}
|
||||
|
||||
return concatBlocks(list);
|
||||
}
|
||||
|
||||
ZLFileImage::Blocks OleStream::concatBlocks(const ZLFileImage::Blocks &blocks) {
|
||||
if (blocks.size() < 2) {
|
||||
return blocks;
|
||||
}
|
||||
ZLFileImage::Blocks optList;
|
||||
ZLFileImage::Block curBlock = blocks.at(0);
|
||||
unsigned int nextOffset = curBlock.offset + curBlock.size;
|
||||
for (size_t i = 1; i < blocks.size(); ++i) {
|
||||
ZLFileImage::Block b = blocks.at(i);
|
||||
if (b.offset == nextOffset) {
|
||||
curBlock.size += b.size;
|
||||
nextOffset += b.size;
|
||||
} else {
|
||||
optList.push_back(curBlock);
|
||||
curBlock = b;
|
||||
nextOffset = curBlock.offset + curBlock.size;
|
||||
}
|
||||
}
|
||||
optList.push_back(curBlock);
|
||||
return optList;
|
||||
}
|
||||
|
||||
size_t OleStream::fileOffset() {
|
||||
size_t sectorSize = (size_t)(myOleEntry.isBigBlock ? myStorage->getSectorSize() : myStorage->getShortSectorSize());
|
||||
unsigned int curBlockNumber = myOleOffset / sectorSize;
|
||||
if (curBlockNumber >= myOleEntry.blocks.size()) {
|
||||
return 0;
|
||||
}
|
||||
unsigned int modBlock = myOleOffset % sectorSize;
|
||||
return myStorage->getFileOffsetOfBlock(myOleEntry, curBlockNumber) + modBlock;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue