Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2010 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkImageInfo.h"
      9 #include "SkReadBuffer.h"
     10 #include "SkWriteBuffer.h"
     11 
     12 static bool alpha_type_is_valid(SkAlphaType alphaType) {
     13     return (alphaType >= 0) && (alphaType <= kLastEnum_SkAlphaType);
     14 }
     15 
     16 static bool color_type_is_valid(SkColorType colorType) {
     17     return (colorType >= 0) && (colorType <= kLastEnum_SkColorType);
     18 }
     19 
     20 void SkImageInfo::unflatten(SkReadBuffer& buffer) {
     21     fWidth = buffer.read32();
     22     fHeight = buffer.read32();
     23 
     24     uint32_t packed = buffer.read32();
     25     SkASSERT(0 == (packed >> 16));
     26     fAlphaType = (SkAlphaType)((packed >> 8) & 0xFF);
     27     fColorType = (SkColorType)((packed >> 0) & 0xFF);
     28     buffer.validate(alpha_type_is_valid(fAlphaType) &&
     29                     color_type_is_valid(fColorType));
     30 }
     31 
     32 void SkImageInfo::flatten(SkWriteBuffer& buffer) const {
     33     buffer.write32(fWidth);
     34     buffer.write32(fHeight);
     35 
     36     SkASSERT(0 == (fAlphaType & ~0xFF));
     37     SkASSERT(0 == (fColorType & ~0xFF));
     38     uint32_t packed = (fAlphaType << 8) | fColorType;
     39     buffer.write32(packed);
     40 }
     41 
     42 bool SkColorTypeValidateAlphaType(SkColorType colorType, SkAlphaType alphaType,
     43                                   SkAlphaType* canonical) {
     44     switch (colorType) {
     45         case kUnknown_SkColorType:
     46             alphaType = kIgnore_SkAlphaType;
     47             break;
     48         case kAlpha_8_SkColorType:
     49             if (kUnpremul_SkAlphaType == alphaType) {
     50                 alphaType = kPremul_SkAlphaType;
     51             }
     52             // fall-through
     53         case kIndex_8_SkColorType:
     54         case kARGB_4444_SkColorType:
     55         case kRGBA_8888_SkColorType:
     56         case kBGRA_8888_SkColorType:
     57             if (kIgnore_SkAlphaType == alphaType) {
     58                 return false;
     59             }
     60             break;
     61         case kRGB_565_SkColorType:
     62             alphaType = kOpaque_SkAlphaType;
     63             break;
     64         default:
     65             return false;
     66     }
     67     if (canonical) {
     68         *canonical = alphaType;
     69     }
     70     return true;
     71 }
     72