1741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
2741143878b23d22cd9cb7b9cba8055179115ce17msarett * Copyright 2015 The Android Open Source Project
3741143878b23d22cd9cb7b9cba8055179115ce17msarett *
4741143878b23d22cd9cb7b9cba8055179115ce17msarett * Use of this source code is governed by a BSD-style license that can be
5741143878b23d22cd9cb7b9cba8055179115ce17msarett * found in the LICENSE file.
6741143878b23d22cd9cb7b9cba8055179115ce17msarett */
7741143878b23d22cd9cb7b9cba8055179115ce17msarett
8741143878b23d22cd9cb7b9cba8055179115ce17msarett#ifndef SkCodecPriv_DEFINED
9741143878b23d22cd9cb7b9cba8055179115ce17msarett#define SkCodecPriv_DEFINED
10741143878b23d22cd9cb7b9cba8055179115ce17msarett
119e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett#include "SkColorTable.h"
12741143878b23d22cd9cb7b9cba8055179115ce17msarett#include "SkImageInfo.h"
13741143878b23d22cd9cb7b9cba8055179115ce17msarett#include "SkSwizzler.h"
14741143878b23d22cd9cb7b9cba8055179115ce17msarett#include "SkTypes.h"
159e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett#include "SkUtils.h"
16741143878b23d22cd9cb7b9cba8055179115ce17msarett
17741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
18741143878b23d22cd9cb7b9cba8055179115ce17msarett *
19741143878b23d22cd9cb7b9cba8055179115ce17msarett * Helper routine for alpha result codes
20741143878b23d22cd9cb7b9cba8055179115ce17msarett *
21741143878b23d22cd9cb7b9cba8055179115ce17msarett */
22741143878b23d22cd9cb7b9cba8055179115ce17msarett#define INIT_RESULT_ALPHA                       \
23741143878b23d22cd9cb7b9cba8055179115ce17msarett    uint8_t zeroAlpha = 0;                      \
24741143878b23d22cd9cb7b9cba8055179115ce17msarett    uint8_t maxAlpha = 0xFF;
25741143878b23d22cd9cb7b9cba8055179115ce17msarett
26741143878b23d22cd9cb7b9cba8055179115ce17msarett#define UPDATE_RESULT_ALPHA(alpha)              \
27741143878b23d22cd9cb7b9cba8055179115ce17msarett    zeroAlpha |= (alpha);                       \
28741143878b23d22cd9cb7b9cba8055179115ce17msarett    maxAlpha  &= (alpha);
29741143878b23d22cd9cb7b9cba8055179115ce17msarett
30741143878b23d22cd9cb7b9cba8055179115ce17msarett#define COMPUTE_RESULT_ALPHA                    \
31741143878b23d22cd9cb7b9cba8055179115ce17msarett    SkSwizzler::GetResult(zeroAlpha, maxAlpha);
32741143878b23d22cd9cb7b9cba8055179115ce17msarett
33741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
34741143878b23d22cd9cb7b9cba8055179115ce17msarett *
359e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett * Copy the codec color table back to the client when kIndex8 color type is requested
369e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett *
379e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett */
389e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarettstatic inline void copy_color_table(const SkImageInfo& dstInfo, SkColorTable* colorTable,
399e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett        SkPMColor* inputColorPtr, int* inputColorCount) {
409e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett    if (kIndex_8_SkColorType == dstInfo.colorType()) {
419e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett        SkASSERT(NULL != inputColorPtr);
429e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett        SkASSERT(NULL != inputColorCount);
439e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett        SkASSERT(NULL != colorTable);
449e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett        sk_memcpy32(inputColorPtr, colorTable->readColors(), *inputColorCount);
459e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett    }
469e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett}
479e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett
489e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett/*
499e43cabaa1ff26167e990f0bcb9a5c20d662d52cmsarett *
50741143878b23d22cd9cb7b9cba8055179115ce17msarett * Compute row bytes for an image using pixels per byte
51741143878b23d22cd9cb7b9cba8055179115ce17msarett *
52741143878b23d22cd9cb7b9cba8055179115ce17msarett */
53741143878b23d22cd9cb7b9cba8055179115ce17msarettstatic inline size_t compute_row_bytes_ppb(int width, uint32_t pixelsPerByte) {
54741143878b23d22cd9cb7b9cba8055179115ce17msarett    return (width + pixelsPerByte - 1) / pixelsPerByte;
55741143878b23d22cd9cb7b9cba8055179115ce17msarett}
56741143878b23d22cd9cb7b9cba8055179115ce17msarett
57741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
58741143878b23d22cd9cb7b9cba8055179115ce17msarett *
59741143878b23d22cd9cb7b9cba8055179115ce17msarett * Compute row bytes for an image using bytes per pixel
60741143878b23d22cd9cb7b9cba8055179115ce17msarett *
61741143878b23d22cd9cb7b9cba8055179115ce17msarett */
62741143878b23d22cd9cb7b9cba8055179115ce17msarettstatic inline size_t compute_row_bytes_bpp(int width, uint32_t bytesPerPixel) {
63741143878b23d22cd9cb7b9cba8055179115ce17msarett    return width * bytesPerPixel;
64741143878b23d22cd9cb7b9cba8055179115ce17msarett}
65741143878b23d22cd9cb7b9cba8055179115ce17msarett
66741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
67741143878b23d22cd9cb7b9cba8055179115ce17msarett *
68741143878b23d22cd9cb7b9cba8055179115ce17msarett * Compute row bytes for an image
69741143878b23d22cd9cb7b9cba8055179115ce17msarett *
70741143878b23d22cd9cb7b9cba8055179115ce17msarett */
71741143878b23d22cd9cb7b9cba8055179115ce17msarettstatic inline size_t compute_row_bytes(int width, uint32_t bitsPerPixel) {
72741143878b23d22cd9cb7b9cba8055179115ce17msarett    if (bitsPerPixel < 16) {
73741143878b23d22cd9cb7b9cba8055179115ce17msarett        SkASSERT(0 == 8 % bitsPerPixel);
74741143878b23d22cd9cb7b9cba8055179115ce17msarett        const uint32_t pixelsPerByte = 8 / bitsPerPixel;
75741143878b23d22cd9cb7b9cba8055179115ce17msarett        return compute_row_bytes_ppb(width, pixelsPerByte);
76741143878b23d22cd9cb7b9cba8055179115ce17msarett    } else {
77741143878b23d22cd9cb7b9cba8055179115ce17msarett        SkASSERT(0 == bitsPerPixel % 8);
78741143878b23d22cd9cb7b9cba8055179115ce17msarett        const uint32_t bytesPerPixel = bitsPerPixel / 8;
79741143878b23d22cd9cb7b9cba8055179115ce17msarett        return compute_row_bytes_bpp(width, bytesPerPixel);
80741143878b23d22cd9cb7b9cba8055179115ce17msarett    }
81741143878b23d22cd9cb7b9cba8055179115ce17msarett}
82741143878b23d22cd9cb7b9cba8055179115ce17msarett
83741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
84741143878b23d22cd9cb7b9cba8055179115ce17msarett *
85741143878b23d22cd9cb7b9cba8055179115ce17msarett * Get a byte from a buffer
86741143878b23d22cd9cb7b9cba8055179115ce17msarett * This method is unsafe, the caller is responsible for performing a check
87741143878b23d22cd9cb7b9cba8055179115ce17msarett *
88741143878b23d22cd9cb7b9cba8055179115ce17msarett */
89741143878b23d22cd9cb7b9cba8055179115ce17msarettstatic inline uint8_t get_byte(uint8_t* buffer, uint32_t i) {
90741143878b23d22cd9cb7b9cba8055179115ce17msarett    return buffer[i];
91741143878b23d22cd9cb7b9cba8055179115ce17msarett}
92741143878b23d22cd9cb7b9cba8055179115ce17msarett
93741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
94741143878b23d22cd9cb7b9cba8055179115ce17msarett *
95741143878b23d22cd9cb7b9cba8055179115ce17msarett * Get a short from a buffer
96741143878b23d22cd9cb7b9cba8055179115ce17msarett * This method is unsafe, the caller is responsible for performing a check
97741143878b23d22cd9cb7b9cba8055179115ce17msarett *
98741143878b23d22cd9cb7b9cba8055179115ce17msarett */
99741143878b23d22cd9cb7b9cba8055179115ce17msarettstatic inline uint16_t get_short(uint8_t* buffer, uint32_t i) {
100741143878b23d22cd9cb7b9cba8055179115ce17msarett    uint16_t result;
101741143878b23d22cd9cb7b9cba8055179115ce17msarett    memcpy(&result, &(buffer[i]), 2);
102741143878b23d22cd9cb7b9cba8055179115ce17msarett#ifdef SK_CPU_BENDIAN
103741143878b23d22cd9cb7b9cba8055179115ce17msarett    return SkEndianSwap16(result);
104741143878b23d22cd9cb7b9cba8055179115ce17msarett#else
105741143878b23d22cd9cb7b9cba8055179115ce17msarett    return result;
106741143878b23d22cd9cb7b9cba8055179115ce17msarett#endif
107741143878b23d22cd9cb7b9cba8055179115ce17msarett}
108741143878b23d22cd9cb7b9cba8055179115ce17msarett
109741143878b23d22cd9cb7b9cba8055179115ce17msarett/*
110741143878b23d22cd9cb7b9cba8055179115ce17msarett *
111741143878b23d22cd9cb7b9cba8055179115ce17msarett * Get an int from a buffer
112741143878b23d22cd9cb7b9cba8055179115ce17msarett * This method is unsafe, the caller is responsible for performing a check
113741143878b23d22cd9cb7b9cba8055179115ce17msarett *
114741143878b23d22cd9cb7b9cba8055179115ce17msarett */
115741143878b23d22cd9cb7b9cba8055179115ce17msarettstatic inline uint32_t get_int(uint8_t* buffer, uint32_t i) {
116741143878b23d22cd9cb7b9cba8055179115ce17msarett    uint32_t result;
117741143878b23d22cd9cb7b9cba8055179115ce17msarett    memcpy(&result, &(buffer[i]), 4);
118741143878b23d22cd9cb7b9cba8055179115ce17msarett#ifdef SK_CPU_BENDIAN
119741143878b23d22cd9cb7b9cba8055179115ce17msarett    return SkEndianSwap32(result);
120741143878b23d22cd9cb7b9cba8055179115ce17msarett#else
121741143878b23d22cd9cb7b9cba8055179115ce17msarett    return result;
122741143878b23d22cd9cb7b9cba8055179115ce17msarett#endif
123741143878b23d22cd9cb7b9cba8055179115ce17msarett}
124741143878b23d22cd9cb7b9cba8055179115ce17msarett
125230d4ac7013f79a3e79efd4452d7fa5c3f508660scroggo#ifdef SK_PRINT_CODEC_MESSAGES
126230d4ac7013f79a3e79efd4452d7fa5c3f508660scroggo    #define SkCodecPrintf SkDebugf
127230d4ac7013f79a3e79efd4452d7fa5c3f508660scroggo#else
128230d4ac7013f79a3e79efd4452d7fa5c3f508660scroggo    #define SkCodecPrintf(...)
129230d4ac7013f79a3e79efd4452d7fa5c3f508660scroggo#endif
130230d4ac7013f79a3e79efd4452d7fa5c3f508660scroggo
131741143878b23d22cd9cb7b9cba8055179115ce17msarett#endif // SkCodecPriv_DEFINED
132