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