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);
        }
    }
Example #2
0
	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_);
    }