Jacek Kucharczyk c582323a8f
JBIG2 Generic Encoder (#264)
* Prepared skeleton and basic component implementations for the jbig2 encoding.

* Added Bitset. Implemented Bitmap.

* Decoder with old Arithmetic Decoder

* Partly working arithmetic

* Working arithmetic decoder.

* MMR patched.

* rebuild to apache.

* Working generic

* Working generic

* Decoded full document

* Update Jenkinsfile go version [master] (#398)

* Update Jenkinsfile go version

* Decoded AnnexH document

* Minor issues fixed.

* Update README.md

* Fixed generic region errors. Added benchmark. Added bitmap unpadder. Added Bitmap toImage method.

* Fixed endofpage error

* Added integration test.

* Decoded all test files without errors. Implemented JBIG2Global.

* Merged with v3 version

* Fixed the EOF in the globals issue

* Fixed the JBIG2 ChocolateData Decode

* JBIG2 Added license information

* Minor fix in jbig2 encoding.

* Applied the logging convention

* Cleaned unnecessary imports

* Go modules clear unused imports

* checked out the README.md

* Moved trace to Debug. Fixed the build integrate tag in the document_decode_test.go

* Initial encoder skeleton

* Applied UniPDF Developer Guide. Fixed lint issues.

* Cleared documentation, fixed style issues.

* Added jbig2 doc.go files. Applied unipdf guide style.

* Minor code style changes.

* Minor naming and style issues fixes.

* Minor naming changes. Style issues fixed.

* Review r11 fixes.

* Added JBIG2 Encoder skeleton.

* Moved Document and Page to jbig2/document package. Created decoder package responsible for decoding jbig2 stream.

* Implemented raster functions.

* Added raster uni low test funcitons.

* Added raster low test functions

* untracked files on jbig2-encoder: c869089 Added raster low test functions

* index on jbig2-encoder: c869089 Added raster low test functions

* Added morph files.

* implemented jbig2 encoder basics

* JBIG2 Encoder - Generic method

* Added jbig2 image encode ttests, black/white image tests

* cleaned and tested jbig2 package

* unfinished jbig2 classified encoder

* jbig2 minor style changes

* minor jbig2 encoder changes

* prepared JBIG2 Encoder

* Style and lint fixes

* Minor changes and lints

* Fixed shift unsinged value build errors

* Minor naming change

* Added jbig2 encode, image gondels. Fixed jbig2 decode bug.

* Provided jbig2 core.DecodeGlobals function.

* Fixed JBIG2Encoder `r6` revision issues.

* Removed public JBIG2Encoder document.

* Minor style changes

* added NewJBIG2Encoder function.

* fixed JBIG2Encoder 'r9' revision issues.

* Cleared 'r9' commented code.

* Updated ACKNOWLEDGEMENETS. Fixed JBIG2Encoder 'r10' revision issues.

Co-authored-by: Gunnsteinn Hall <gunnsteinn.hall@gmail.com>
2020-03-27 11:47:41 +00:00

117 lines
2.7 KiB
Go

/*
* This file is subject to the terms and conditions defined in
* file 'LICENSE.md', which is part of this source code package.
*/
package arithmetic
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/unidoc/unipdf/v3/internal/jbig2/decoder/arithmetic"
"github.com/unidoc/unipdf/v3/internal/jbig2/reader"
)
// TestEncoder tests the encoder using the standard H.2 test sequence.
func TestEncoder(t *testing.T) {
testSequence := []byte{0x00, 0x02, 0x00, 0x51, 0x00, 0x00, 0x00, 0xC0, 0x03, 0x52, 0x87, 0x2A, 0xAA, 0xAA, 0xAA, 0xAA, 0x82, 0xC0, 0x20, 0x00, 0xFC, 0xD7, 0x9E, 0xF6, 0xBF, 0x7F, 0xED, 0x90, 0x4F, 0x46, 0xA3, 0xBF}
require.Len(t, testSequence, 32)
shouldBe := []byte{0x84, 0xC7, 0x3B, 0xFC, 0xE1, 0xA1, 0x43, 0x04, 0x02, 0x20, 0x00, 0x00, 0x41, 0x0D, 0xBB, 0x86, 0xF4, 0x31, 0x7F, 0xFF, 0x88, 0xFF, 0x37, 0x47, 0x1A, 0xDB, 0x6A, 0xDF, 0xFF, 0xAC}
require.Len(t, shouldBe, 30)
e := &Encoder{}
e.Init()
prev := uint32(0)
for _, b := range testSequence {
for i := 7; i >= 0; i-- {
bit := (b >> uint(i)) & 0x1
// fmt.Printf("Byte: %08b, Bit: %d, Value: %01b\n", b, i, bit)
err := e.encodeBit(e.context, prev, bit)
require.NoError(t, err)
}
}
e.flush()
assert.Equal(t, 30, e.outbufUsed)
buf := &bytes.Buffer{}
n, err := e.WriteTo(buf)
assert.Equal(t, int64(30), n)
require.NoError(t, err)
result := buf.Bytes()
assert.Len(t, result, 30)
if assert.True(t, len(result) <= len(shouldBe)) {
for i := 0; i < len(result); i++ {
assert.Equal(t, shouldBe[i], result[i], "At index: '%d'", i)
}
}
}
// TestEncodeInteger tests the encode integer function.
func TestEncodeInteger(t *testing.T) {
e := New()
err := e.EncodeInteger(IADT, 5)
require.NoError(t, err)
err = e.EncodeInteger(IADH, 10)
require.NoError(t, err)
err = e.EncodeOOB(IADH)
require.NoError(t, err)
err = e.EncodeOOB(IADT)
require.NoError(t, err)
e.Final()
buf := &bytes.Buffer{}
_, err = e.WriteTo(buf)
require.NoError(t, err)
r := reader.New(buf.Bytes())
dec, err := arithmetic.New(r)
require.NoError(t, err)
dt, err := dec.DecodeInt(arithmetic.NewStats(512, 1))
require.NoError(t, err)
dh, err := dec.DecodeInt(arithmetic.NewStats(512, 1))
require.NoError(t, err)
assert.Equal(t, 5, int(dt))
assert.Equal(t, 10, int(dh))
}
func TestEncoder_EncodeIAID(t *testing.T) {
e := New()
err := e.EncodeIAID(3, 4)
require.NoError(t, err)
buf := &bytes.Buffer{}
e.Final()
// write to buffer
_, err = e.WriteTo(buf)
require.NoError(t, err)
r := reader.New(buf.Bytes())
d, err := arithmetic.New(r)
require.NoError(t, err)
v, err := d.DecodeIAID(3, arithmetic.NewStats(512, 0))
require.NoError(t, err)
assert.Equal(t, int64(4), v)
}