Make SkCodec support peek() and read()
authorscroggo <scroggo@google.com>
Wed, 9 Dec 2015 02:54:13 +0000 (18:54 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 9 Dec 2015 02:54:13 +0000 (18:54 -0800)
commitdb30be2f9470d21fe37b63d145c1fcca9a6ad98c
tree885e9e207682233ab03acaba6461c34779c288ee
parent0671b967eb02d44c8951dc4dc39df09fac15b097
Make SkCodec support peek() and read()

- Update SkCodec's dox to point out that some of the data must be
  read twice in order to decode
- Add an accessor that reports how much is needed for reading twice
- Make SkCodec default to use peek()
  If an input stream supports peek()ing, peek() instead of reading.
  This way the stream need not implement rewind()
- Make SkCodec use read() + rewind() as a backup
  So that streams without peek() implemented can still function
  properly (assuming they can rewind).
- read everything we may need to determine the format once
  In SkCodec::NewFromStream, peek()/read() 14 bytes, which is enough
  to read all of the types we support. Pass the buffer to each subtype,
  which will have enough info to determine whether it is the right
  type. This simplifies the code and results in less reading and
  rewinding.
  - NOTE: SkWbmpCodec needs the following number of bytes for the header
    + 1 (type)
    + 1 (reserved)
    + 3 (width - bytes needed to support up to 0xFFFF)
    + 3 (height - bytes needed to support up to 0xFFFF)
    = 8
- in SkWebpCodec, support using read + rewind as a backup if peek does
  not work.

A change in Android will add peek() to JavaInputStreamAdapter.

BUG=skia:3257

Review URL: https://codereview.chromium.org/1472123002
17 files changed:
include/codec/SkCodec.h
src/codec/SkBmpCodec.cpp
src/codec/SkBmpCodec.h
src/codec/SkCodec.cpp
src/codec/SkCodec_libgif.cpp
src/codec/SkCodec_libgif.h
src/codec/SkCodec_libico.cpp
src/codec/SkCodec_libico.h
src/codec/SkCodec_libpng.cpp
src/codec/SkCodec_libpng.h
src/codec/SkCodec_wbmp.cpp
src/codec/SkCodec_wbmp.h
src/codec/SkJpegCodec.cpp
src/codec/SkJpegCodec.h
src/codec/SkWebpCodec.cpp
src/codec/SkWebpCodec.h
tests/CodexTest.cpp