Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2017 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 #ifndef SkUnPreMultiplyPriv_DEFINED
      9 #define SkUnPreMultiplyPriv_DEFINED
     10 
     11 #include "SkColor.h"
     12 #include "SkUnPreMultiply.h"
     13 
     14 template <bool kSwapRB>
     15 void SkUnpremultiplyRow(uint32_t* dst, const uint32_t* src, int count) {
     16     const SkUnPreMultiply::Scale* table = SkUnPreMultiply::GetScaleTable();
     17 
     18     for (int i = 0; i < count; i++) {
     19         uint32_t c = *src++;
     20         uint8_t r, g, b, a;
     21         if (kSwapRB) {
     22             r = (c >> 16) & 0xFF;
     23             g = (c >>  8) & 0xFF;
     24             b = (c >>  0) & 0xFF;
     25             a = (c >> 24) & 0xFF;
     26         } else {
     27             r = (c >>  0) & 0xFF;
     28             g = (c >>  8) & 0xFF;
     29             b = (c >> 16) & 0xFF;
     30             a = (c >> 24) & 0xFF;
     31         }
     32 
     33         if (0 != a && 255 != a) {
     34             SkUnPreMultiply::Scale scale = table[a];
     35             r = SkUnPreMultiply::ApplyScale(scale, r);
     36             g = SkUnPreMultiply::ApplyScale(scale, g);
     37             b = SkUnPreMultiply::ApplyScale(scale, b);
     38         }
     39 
     40         *dst++ = (r << 0) | (g << 8) | (b << 16) | (a << 24);
     41     }
     42 }
     43 
     44 #endif
     45