ccitt: fix byte align and invert flag

Change-Id: I49955017deb8243b19dc1bb222ff8622ac3ff6af
Reviewed-on: https://go-review.googlesource.com/c/image/+/190677
Run-TryBot: Benny Siegert <bsiegert@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
This commit is contained in:
Horst Rutter 2019-08-17 15:25:05 +02:00 коммит произвёл Nigel Tao
Родитель 3a9bac650e
Коммит 23ea20f87c
8 изменённых файлов: 36 добавлений и 14 удалений

Просмотреть файл

@ -269,6 +269,12 @@ func (z *reader) Read(p []byte) (int, error) {
}
byteValue := byte(0)
if z.invert {
// Set the end-of-row padding bits to 1 (if inverted) or 0. If inverted, the 1s
// are temporary, and will be flipped back to 0s by the invertBytes call below.
byteValue = 0xFF >> uint(numToPack)
}
for j := 0; j < numToPack; j++ {
byteValue |= (z.curr[z.ri] & 0x80) >> uint(j)
z.ri++
@ -285,7 +291,6 @@ func (z *reader) Read(p []byte) (int, error) {
}
n := len(originalP) - len(p)
// TODO: when invert is true, should the end-of-row padding bits be 0 or 1?
if z.invert {
invertBytes(originalP[:n])
}
@ -369,6 +374,10 @@ func (z *reader) decodeRow() error {
z.atStartOfRow = true
z.penColorIsWhite = true
if z.align {
z.br.alignToByteBoundary()
}
switch z.subFormat {
case Group3:
for ; z.wi < len(z.curr); z.atStartOfRow = false {
@ -379,10 +388,6 @@ func (z *reader) decodeRow() error {
return z.decodeEOL()
case Group4:
if z.align {
z.br.alignToByteBoundary()
}
for ; z.wi < len(z.curr); z.atStartOfRow = false {
mode, err := decode(&z.br, modeDecodeTable[:])
if err != nil {

Просмотреть файл

@ -14,6 +14,7 @@ import (
"os"
"path/filepath"
"reflect"
"strings"
"testing"
"unsafe"
)
@ -198,25 +199,23 @@ func TestDecodeInvalidCode(t *testing.T) {
}
}
func TestReadRegular(t *testing.T) { testRead(t, false) }
func TestReadInvert(t *testing.T) { testRead(t, true) }
func testRead(t *testing.T, invert bool) {
func testRead(t *testing.T, fileName string, sf SubFormat, align, invert bool) {
t.Helper()
const width, height = 153, 55
opts := &Options{
Align: align,
Invert: invert,
}
got := ""
{
f, err := os.Open("testdata/bw-gopher.ccitt_group3")
f, err := os.Open(fileName)
if err != nil {
t.Fatalf("Open: %v", err)
}
defer f.Close()
gotBytes, err := ioutil.ReadAll(NewReader(f, MSB, Group3, width, height, opts))
gotBytes, err := ioutil.ReadAll(NewReader(f, MSB, sf, width, height, opts))
if err != nil {
t.Fatalf("ReadAll: %v", err)
}
@ -261,9 +260,6 @@ func testRead(t *testing.T, invert bool) {
}
}
}
if invert {
invertBytes(wantBytes)
}
want = string(wantBytes)
}
@ -292,6 +288,27 @@ func testRead(t *testing.T, invert bool) {
}
}
func TestRead(t *testing.T) {
for _, fileName := range []string{
"testdata/bw-gopher.ccitt_group3",
"testdata/bw-gopher-aligned.ccitt_group3",
"testdata/bw-gopher-inverted.ccitt_group3",
"testdata/bw-gopher-inverted-aligned.ccitt_group3",
"testdata/bw-gopher.ccitt_group4",
"testdata/bw-gopher-aligned.ccitt_group4",
"testdata/bw-gopher-inverted.ccitt_group4",
"testdata/bw-gopher-inverted-aligned.ccitt_group4",
} {
subFormat := Group3
if strings.HasSuffix(fileName, "group4") {
subFormat = Group4
}
align := strings.Contains(fileName, "aligned")
invert := strings.Contains(fileName, "inverted")
testRead(t, fileName, subFormat, align, invert)
}
}
func TestDecodeIntoGray(t *testing.T) {
for _, tt := range []struct {
fileName string

Двоичные данные
ccitt/testdata/bw-gopher-aligned.ccitt_group3 поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
ccitt/testdata/bw-gopher-aligned.ccitt_group4 поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
ccitt/testdata/bw-gopher-inverted-aligned.ccitt_group3 поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
ccitt/testdata/bw-gopher-inverted-aligned.ccitt_group4 поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
ccitt/testdata/bw-gopher-inverted.ccitt_group3 поставляемый Normal file

Двоичный файл не отображается.

Двоичные данные
ccitt/testdata/bw-gopher-inverted.ccitt_group4 поставляемый Normal file

Двоичный файл не отображается.