| 214 | } |
| 215 | |
| 216 | uint8* CvStreamReader::GetPermanentPtr(int offset, int size, bool* madeCopy) |
| 217 | { |
| 218 | int pageStart = offset >> mPageBits; |
| 219 | int pageEnd = (offset + size - 1) >> mPageBits; |
| 220 | |
| 221 | if (pageStart == pageEnd) |
| 222 | return mStreamPtrs.mVals[pageStart] + (offset & ((1 << mPageBits) - 1)); |
| 223 | |
| 224 | // Handle the relatively-rare case of spanning multiple pages |
| 225 | BP_ALLOC("GetPermanentPtr", size); |
| 226 | uint8* destData = mCOFF->mAlloc.AllocBytes(size, "GetPermanentPtr"); |
| 227 | if (madeCopy != NULL) |
| 228 | *madeCopy = true; |
| 229 | |
| 230 | uint8* destPtr = destData; |
| 231 | while (size > 0) |
| 232 | { |
| 233 | int copyPage = offset >> mPageBits; |
| 234 | int pageOffset = offset & ((1 << mPageBits) - 1); |
| 235 | int copyBytes = BF_MIN(mCOFF->mCvPageSize - pageOffset, size); |
| 236 | memcpy(destPtr, mStreamPtrs.mVals[copyPage] + pageOffset, copyBytes); |
| 237 | destPtr += copyBytes; |
| 238 | offset += copyBytes; |
| 239 | size -= copyBytes; |
| 240 | } |
| 241 | return destData; |
| 242 | } |
| 243 | |
| 244 | ////////////////////////////////////////////////////////////////////////// |
| 245 |
no test coverage detected