1f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com/*
2f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com * Copyright 2010 Google Inc.
3f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com *
4f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com * Use of this source code is governed by a BSD-style license that can be
5f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com * found in the LICENSE file.
6f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com */
7f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com
8f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com#include "SkImageInfo.h"
98b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkReadBuffer.h"
108b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org#include "SkWriteBuffer.h"
11f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com
12ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.orgstatic bool alpha_type_is_valid(SkAlphaType alphaType) {
13ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org    return (alphaType >= 0) && (alphaType <= kLastEnum_SkAlphaType);
14ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org}
15ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org
16ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.orgstatic bool color_type_is_valid(SkColorType colorType) {
17ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org    return (colorType >= 0) && (colorType <= kLastEnum_SkColorType);
18ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org}
19ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org
208b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkImageInfo::unflatten(SkReadBuffer& buffer) {
21f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    fWidth = buffer.read32();
22f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    fHeight = buffer.read32();
23f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com
24f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    uint32_t packed = buffer.read32();
25f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    SkASSERT(0 == (packed >> 16));
26f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    fAlphaType = (SkAlphaType)((packed >> 8) & 0xFF);
27f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    fColorType = (SkColorType)((packed >> 0) & 0xFF);
28ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org    buffer.validate(alpha_type_is_valid(fAlphaType) &&
29ef74fa189b738e13295d6a96f86a6e10223505a8commit-bot@chromium.org                    color_type_is_valid(fColorType));
30f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com}
31f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com
328b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkImageInfo::flatten(SkWriteBuffer& buffer) const {
33f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    buffer.write32(fWidth);
34f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    buffer.write32(fHeight);
35f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com
36f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    SkASSERT(0 == (fAlphaType & ~0xFF));
37f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    SkASSERT(0 == (fColorType & ~0xFF));
38f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    uint32_t packed = (fAlphaType << 8) | fColorType;
39f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com    buffer.write32(packed);
40f309dbcf2a8084afc44774a675c68756993acbc3reed@google.com}
412fd0d14b9be34a7a945942733c3516d97d07f516scroggo
422fd0d14b9be34a7a945942733c3516d97d07f516scroggobool SkColorTypeValidateAlphaType(SkColorType colorType, SkAlphaType alphaType,
432fd0d14b9be34a7a945942733c3516d97d07f516scroggo                                  SkAlphaType* canonical) {
442fd0d14b9be34a7a945942733c3516d97d07f516scroggo    switch (colorType) {
452fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kUnknown_SkColorType:
462fd0d14b9be34a7a945942733c3516d97d07f516scroggo            alphaType = kIgnore_SkAlphaType;
472fd0d14b9be34a7a945942733c3516d97d07f516scroggo            break;
482fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kAlpha_8_SkColorType:
492fd0d14b9be34a7a945942733c3516d97d07f516scroggo            if (kUnpremul_SkAlphaType == alphaType) {
502fd0d14b9be34a7a945942733c3516d97d07f516scroggo                alphaType = kPremul_SkAlphaType;
512fd0d14b9be34a7a945942733c3516d97d07f516scroggo            }
522fd0d14b9be34a7a945942733c3516d97d07f516scroggo            // fall-through
532fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kIndex_8_SkColorType:
542fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kARGB_4444_SkColorType:
552fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kRGBA_8888_SkColorType:
562fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kBGRA_8888_SkColorType:
572fd0d14b9be34a7a945942733c3516d97d07f516scroggo            if (kIgnore_SkAlphaType == alphaType) {
582fd0d14b9be34a7a945942733c3516d97d07f516scroggo                return false;
592fd0d14b9be34a7a945942733c3516d97d07f516scroggo            }
602fd0d14b9be34a7a945942733c3516d97d07f516scroggo            break;
612fd0d14b9be34a7a945942733c3516d97d07f516scroggo        case kRGB_565_SkColorType:
622fd0d14b9be34a7a945942733c3516d97d07f516scroggo            alphaType = kOpaque_SkAlphaType;
632fd0d14b9be34a7a945942733c3516d97d07f516scroggo            break;
642fd0d14b9be34a7a945942733c3516d97d07f516scroggo        default:
652fd0d14b9be34a7a945942733c3516d97d07f516scroggo            return false;
662fd0d14b9be34a7a945942733c3516d97d07f516scroggo    }
672fd0d14b9be34a7a945942733c3516d97d07f516scroggo    if (canonical) {
682fd0d14b9be34a7a945942733c3516d97d07f516scroggo        *canonical = alphaType;
692fd0d14b9be34a7a945942733c3516d97d07f516scroggo    }
702fd0d14b9be34a7a945942733c3516d97d07f516scroggo    return true;
712fd0d14b9be34a7a945942733c3516d97d07f516scroggo}
72