mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00

* 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>
117 lines
2.7 KiB
Go
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)
|
|
}
|