SkPackBits.h revision 0910916c0f7b951ee55c4b7c6358295b9bca0565
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License.
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkPackBits_DEFINED
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkPackBits_DEFINED
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkTypes.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPackBits {
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Given the number of 16bit values that will be passed to Pack16,
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns the worst-case size needed for the dst[] buffer.
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t ComputeMaxSize16(int count);
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Given the number of 8bit values that will be passed to Pack8,
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        returns the worst-case size needed for the dst[] buffer.
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t ComputeMaxSize8(int count);
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Write the src array into a packed format. The packing process may end
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        up writing more bytes than it read, so dst[] must be large enough.
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input array of 16bit values
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param count    Number of entries in src[]
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to write the packed data
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        into
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of bytes written to dst[]
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t Pack16(const uint16_t src[], int count, uint8_t dst[]);
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Write the src array into a packed format. The packing process may end
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        up writing more bytes than it read, so dst[] must be large enough.
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input array of 8bit values
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param count    Number of entries in src[]
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to write the packed data
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        into
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of bytes written to dst[]
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static size_t Pack8(const uint8_t src[], int count, uint8_t dst[]);
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Unpack the data in src[], and expand it into dst[]. The src[] data was
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        written by a previous call to Pack16.
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src  Input data to unpack, previously created by Pack16.
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param srcSize  Number of bytes of src to unpack
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst  Buffer (allocated by caller) to expand the src[] into.
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of dst elements (not bytes) written into dst.
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int Unpack16(const uint8_t src[], size_t srcSize, uint16_t dst[]);
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Unpack the data in src[], and expand it into dst[]. The src[] data was
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        written by a previous call to Pack8.
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input data to unpack, previously created by Pack8.
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param srcSize  Number of bytes of src to unpack
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to expand the src[] into.
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @return the number of bytes written into dst.
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static int Unpack8(const uint8_t src[], size_t srcSize, uint8_t dst[]);
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Unpack the data from src[], skip the first dstSkip bytes, then write
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        dstWrite bytes into dst[]. The src[] data was written by a previous
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        call to Pack8. Return the number of bytes actually writtten into dst[]
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param src      Input data to unpack, previously created by Pack8.
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dst      Buffer (allocated by caller) to expand the src[] into.
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dstSkip  Number of bytes of unpacked src to skip before writing
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        into dst
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        @param dstWrite Number of bytes of unpacked src to write into dst (after
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        skipping dstSkip bytes)
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    static void Unpack8(uint8_t dst[], size_t dstSkip, size_t dstWrite,
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                        const uint8_t src[]);
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
87