void Decompress(char* source, char* dest) { BinaryReader reader(source); ReadHeader(reader); BinaryWriter writer(dest); SlidingWindow window(nullptr, bufferSize_, MaxOffset(), MaxLength() - 1); window.Initialize(); while(reader.IsEOF() == false) { int length = reader.ReadBits(lengthBits_); int value; if(length == MaxLength()) { break; } if(length == 0) { value = reader.ReadByte(); } else { int offset = reader.ReadBits(offsetBits_); value = reader.ReadByte(); for(int i = 0; i < length; i++) { int temp = window.CurrentByte(-offset - 1); writer.WriteByte(temp); window.WriteByte(temp); window.AdvanceWindow(1); } } writer.WriteByte(value); window.WriteByte(value); window.AdvanceWindow(1); } }
bool Document::Update() { bool rc = true; bool scrolling = false; if(Touch(0).Pressed()) { mTouchPosition = Vec2(Touch(0).mPosition); mCurrentLink = GetLinkRectangle(Touch(0).mPosition); mGrabbed = true; rc = false; } else if(mGrabbed) { if(Touch(0).Held()) { Vec2 vel (Touch(0).mPosition - Touch(0).mPreviousPosition); if(vel.x != 0 || vel.y != 0) { mScrollVelocity = vel; scrolling = true; } if(mCurrentLink != GetLinkRectangle(Touch(0).mPosition)) { mCurrentLink = null; } } else if(Touch(0).Released()) { mGrabbed = false; scrolling = true; if(mCurrentLink != null) { if(mLinkClickCallback != null) { mLinkClickCallback(mCurrentLink); } } mCurrentLink = null; } else { scrolling = true; } } if(scrolling) { mScrollPosition -= mScrollVelocity; mScrollPosition = Min(Max(Vec2::zero, mScrollPosition), MaxOffset()); } mScrollVelocity *= 0.95f; return rc; }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Compress(char* source, char* dest, unsigned offsetBits, unsigned lengthBits) { assert(source != nullptr); assert(dest != nullptr); offsetBits_ = offsetBits; lengthBits_ = lengthBits; BinaryReader reader(source); SlidingWindow window(&reader, bufferSize_, MaxOffset(), MaxLength() - 1); window.Initialize(); BinaryWriter writer(dest); WriteHeader(writer); while(window.IsEOF() == false) { unsigned length; unsigned offset; if(window.FindLongestMatch(offset, length)) { unsigned char current; window.AdvanceWindow(length + 1); if(window.IsOutside()) { current = window.CurrentByte(-2); length--; } else current = window.CurrentByte(-1); if(length > 0) { writer.WriteBits(length, lengthBits_); writer.WriteBits(offset, offsetBits_); writer.WriteByte(current); if(logTokens_) { char buffer[1024]; std::sprintf(buffer, "o: %d, l: %d, c: %d ", offset, length, current); tokenLog_ += buffer; } } else { writer.WriteBits(0, lengthBits_); writer.WriteByte(current); if(logTokens_) { char buffer[1024]; std::sprintf(buffer, "o: %d, l: %d, c: %d ", 0, 0, current); tokenLog_ += buffer; } } } else { writer.WriteBits(0, lengthBits_); writer.WriteByte(window.CurrentByte()); if(logTokens_) { char buffer[1024]; std::sprintf(buffer, "o: %d, l: %d, c: %d ", 0, 0, window.CurrentByte()); tokenLog_ += buffer; } window.AdvanceWindow(1); } } writer.WriteBits(MaxLength(), lengthBits_); }