unipdf/internal/jbig2/document/segments/generic-region_test.go
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

202 lines
6.0 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 segments
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/unidoc/unipdf/v3/common"
"github.com/unidoc/unipdf/v3/internal/jbig2/bitmap"
"github.com/unidoc/unipdf/v3/internal/jbig2/reader"
"github.com/unidoc/unipdf/v3/internal/jbig2/writer"
)
// TestDecodeGenericRegion tests the decode process of the jbig2 Generic Region.
func TestDecodeGenericRegion(t *testing.T) {
if testing.Verbose() {
common.SetLogger(common.NewConsoleLogger(common.LogLevelDebug))
}
t.Run("AnnexH", func(t *testing.T) {
t.Run("S-12th", func(t *testing.T) {
data := []byte{
// header
0x00, 0x00, 0x00, 0x0B, 0x27, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23,
// data
0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x0B, 0x00, 0x08, 0x03, 0xFF, 0xFD, 0xFF, 0x02, 0xFE,
0xFE, 0xFE, 0x04, 0xEE, 0xED, 0x87, 0xFB, 0xCB, 0x2B, 0xFF, 0xAC,
}
r := reader.New(data)
d := &document{}
h, err := NewHeader(d, r, 0, OSequential)
require.NoError(t, err)
assert.Equal(t, uint32(11), h.SegmentNumber)
assert.Equal(t, uint64(35), h.SegmentDataLength)
assert.Equal(t, 2, h.PageAssociation)
sg, err := h.GetSegmentData()
require.NoError(t, err)
s, ok := sg.(*GenericRegion)
require.True(t, ok)
assert.Equal(t, uint32(44), s.RegionSegment.BitmapHeight)
assert.Equal(t, uint32(54), s.RegionSegment.BitmapWidth)
assert.Equal(t, bitmap.CmbOpOr, s.RegionSegment.CombinaionOperator)
assert.Equal(t, true, s.IsTPGDon)
assert.Equal(t, byte(0), s.GBTemplate)
bm, err := s.GetRegionBitmap()
require.NoError(t, err)
assert.Equal(t, bitmap.TstFrameBitmapData(), bm.Data)
})
t.Run("S-5th", func(t *testing.T) {
data := []byte{
// Header
0x00, 0x00, 0x00, 0x04, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2C,
// Data part
0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x26, 0xA0, 0x71, 0xCE,
0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xF0,
}
r := reader.New(data)
d := &document{}
h, err := NewHeader(d, r, 0, OSequential)
require.NoError(t, err)
assert.Equal(t, uint32(4), h.SegmentNumber)
assert.Equal(t, uint64(44), h.SegmentDataLength)
assert.Equal(t, 1, h.PageAssociation)
gs, err := h.GetSegmentData()
require.NoError(t, err)
s, ok := gs.(*GenericRegion)
require.True(t, ok)
assert.Equal(t, uint32(44), s.RegionSegment.BitmapHeight)
assert.Equal(t, uint32(54), s.RegionSegment.BitmapWidth)
assert.Equal(t, bitmap.CmbOpOr, s.RegionSegment.CombinaionOperator)
assert.Equal(t, true, s.IsMMREncoded)
b, err := s.GetRegionBitmap()
require.NoError(t, err)
assert.Equal(t, bitmap.TstFrameBitmapData(), b.Data)
})
})
}
// TestEncodeGenericRegion tests the Encode method of the generic region.
func TestEncodeGenericRegion(t *testing.T) {
t.Run("NoDuplicateRemoval", func(t *testing.T) {
common.SetLogger(common.NewConsoleLogger(common.LogLevelDebug))
genericRegion := &GenericRegion{}
h := &Header{SegmentNumber: 11, PageAssociation: 2, Type: TImmediateGenericRegion, SegmentData: genericRegion}
// prepare image of size 54x44
// with the frame of size '2'
bm := bitmap.TstFrameBitmap()
// initialize the generic region encode method
err := genericRegion.InitEncode(bm, 0, 0, 0, false)
require.NoError(t, err)
// prepare writer
w := writer.BufferedMSB()
// encode the generic region header
n, err := h.Encode(w)
require.NoError(t, err)
assert.Equal(t, len(w.Data()), n)
r := reader.New(w.Data())
d := &document{}
hd, err := NewHeader(d, r, 0, OSequential)
require.NoError(t, err)
assert.Equal(t, uint32(11), hd.SegmentNumber)
assert.Equal(t, uint64(46), hd.SegmentDataLength)
assert.Equal(t, 2, hd.PageAssociation)
assert.Equal(t, TImmediateGenericRegion, hd.Type)
sg, err := hd.GetSegmentData()
require.NoError(t, err)
s, ok := sg.(*GenericRegion)
require.True(t, ok)
assert.Equal(t, uint32(44), s.RegionSegment.BitmapHeight)
assert.Equal(t, uint32(54), s.RegionSegment.BitmapWidth)
assert.Equal(t, bitmap.CmbOpOr, s.RegionSegment.CombinaionOperator)
assert.Equal(t, false, s.IsTPGDon)
assert.Equal(t, byte(0), s.GBTemplate)
bm, err = s.GetRegionBitmap()
require.NoError(t, err)
assert.Equal(t, bitmap.TstFrameBitmapData(), bm.Data)
})
t.Run("DuplicateRemoval", func(t *testing.T) {
common.SetLogger(common.NewConsoleLogger(common.LogLevelDebug))
genericRegion := &GenericRegion{}
h := &Header{SegmentNumber: 11, PageAssociation: 2, Type: TImmediateGenericRegion, SegmentData: genericRegion}
bm := bitmap.TstFrameBitmap()
// initialize the generic region encode method
err := genericRegion.InitEncode(bm, 0, 0, 0, true)
require.NoError(t, err)
w := writer.BufferedMSB()
// encode the header
n, err := h.Encode(w)
require.NoError(t, err)
// check the number of bytes written match the 'n' number.
assert.Equal(t, len(w.Data()), n)
r := reader.New(w.Data())
d := &document{}
hd, err := NewHeader(d, r, 0, OSequential)
require.NoError(t, err)
assert.Equal(t, uint32(11), hd.SegmentNumber)
assert.Equal(t, uint64(35), hd.SegmentDataLength)
assert.Equal(t, 2, hd.PageAssociation)
assert.Equal(t, TImmediateGenericRegion, hd.Type)
sg, err := hd.GetSegmentData()
require.NoError(t, err)
s, ok := sg.(*GenericRegion)
require.True(t, ok)
assert.Equal(t, uint32(44), s.RegionSegment.BitmapHeight)
assert.Equal(t, uint32(54), s.RegionSegment.BitmapWidth)
assert.Equal(t, bitmap.CmbOpOr, s.RegionSegment.CombinaionOperator)
assert.Equal(t, true, s.IsTPGDon)
assert.Equal(t, byte(0), s.GBTemplate)
bm, err = s.GetRegionBitmap()
require.NoError(t, err)
assert.Equal(t, bitmap.TstFrameBitmapData(), bm.Data)
})
}