зеркало из https://github.com/golang/image.git
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:
Родитель
3a9bac650e
Коммит
23ea20f87c
|
@ -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
|
||||
|
|
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Загрузка…
Ссылка в новой задаче