11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2008 The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkPackBits_DEFINED
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkPackBits_DEFINED
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPackBits {
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Given the number of 16bit values that will be passed to Pack16,
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns the worst-case size needed for the dst[] buffer.
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t ComputeMaxSize16(int count);
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Given the number of 8bit values that will be passed to Pack8,
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns the worst-case size needed for the dst[] buffer.
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t ComputeMaxSize8(int count);
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Write the src array into a packed format. The packing process may end
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        up writing more bytes than it read, so dst[] must be large enough.
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input array of 16bit values
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param count    Number of entries in src[]
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to write the packed data
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        into
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of bytes written to dst[]
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t Pack16(const uint16_t src[], int count, uint8_t dst[]);
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Write the src array into a packed format. The packing process may end
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        up writing more bytes than it read, so dst[] must be large enough.
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input array of 8bit values
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param count    Number of entries in src[]
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to write the packed data
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        into
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of bytes written to dst[]
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t Pack8(const uint8_t src[], int count, uint8_t dst[]);
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Unpack the data in src[], and expand it into dst[]. The src[] data was
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        written by a previous call to Pack16.
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src  Input data to unpack, previously created by Pack16.
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param srcSize  Number of bytes of src to unpack
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst  Buffer (allocated by caller) to expand the src[] into.
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of dst elements (not bytes) written into dst.
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int Unpack16(const uint8_t src[], size_t srcSize, uint16_t dst[]);
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Unpack the data in src[], and expand it into dst[]. The src[] data was
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        written by a previous call to Pack8.
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input data to unpack, previously created by Pack8.
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param srcSize  Number of bytes of src to unpack
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to expand the src[] into.
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of bytes written into dst.
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int Unpack8(const uint8_t src[], size_t srcSize, uint8_t dst[]);
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Unpack the data from src[], skip the first dstSkip bytes, then write
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dstWrite bytes into dst[]. The src[] data was written by a previous
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        call to Pack8. Return the number of bytes actually writtten into dst[]
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input data to unpack, previously created by Pack8.
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to expand the src[] into.
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dstSkip  Number of bytes of unpacked src to skip before writing
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        into dst
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dstWrite Number of bytes of unpacked src to write into dst (after
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        skipping dstSkip bytes)
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static void Unpack8(uint8_t dst[], size_t dstSkip, size_t dstWrite,
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const uint8_t src[]);
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
80