1d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein/* 2d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein * Copyright 2015 Google Inc. 3d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein * 4d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein * Use of this source code is governed by a BSD-style license that can be 5d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein * found in the LICENSE file. 6d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein */ 7d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 8d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein#include "SkUtils.h" 9d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 10d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleinstatic_assert(sizeof(Sk4px) == 16, "This file uses memcpy / sk_memset32, so exact size matters."); 11d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 12d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px::Sk4px(SkPMColor px) { 13d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein sk_memset32((uint32_t*)this, px, 4); 14d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 15d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 16d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px Sk4px::Load4(const SkPMColor px[4]) { 17d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein Sk4px px4 = Sk16b(); 18d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein memcpy(&px4, px, 16); 19d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein return px4; 20d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 21d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 22d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px Sk4px::Load2(const SkPMColor px[2]) { 23d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein Sk4px px2 = Sk16b(); 24d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein memcpy(&px2, px, 8); 25d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein return px2; 26d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 27d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 28d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px Sk4px::Load1(const SkPMColor px[1]) { 29d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein Sk4px px1 = Sk16b(); 30d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein memcpy(&px1, px, 4); 31d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein return px1; 32d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 33d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 34d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline void Sk4px::store4(SkPMColor px[4]) const { memcpy(px, this, 16); } 35d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline void Sk4px::store2(SkPMColor px[2]) const { memcpy(px, this, 8); } 36d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline void Sk4px::store1(SkPMColor px[1]) const { memcpy(px, this, 4); } 37d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 38d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px::Wide Sk4px::widenLo() const { 39d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein return Sk16h(this->kth< 0>(), this->kth< 1>(), this->kth< 2>(), this->kth< 3>(), 40d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein this->kth< 4>(), this->kth< 5>(), this->kth< 6>(), this->kth< 7>(), 41d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein this->kth< 8>(), this->kth< 9>(), this->kth<10>(), this->kth<11>(), 42d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein this->kth<12>(), this->kth<13>(), this->kth<14>(), this->kth<15>()); 43d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 44d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 45d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px::Wide Sk4px::widenHi() const { return this->widenLo() << 8; } 46d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 47d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px::Wide Sk4px::mulWiden(const Sk16b& other) const { 48d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein return this->widenLo() * Sk4px(other).widenLo(); 49d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 50d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein 51d2ffd36eb62e99abe2920369d1e040954cc2044fmtkleininline Sk4px Sk4px::Wide::addNarrowHi(const Sk16h& other) const { 52d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein Sk4px::Wide r = (*this + other) >> 8; 53d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein return Sk16b(r.kth< 0>(), r.kth< 1>(), r.kth< 2>(), r.kth< 3>(), 54d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein r.kth< 4>(), r.kth< 5>(), r.kth< 6>(), r.kth< 7>(), 55d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein r.kth< 8>(), r.kth< 9>(), r.kth<10>(), r.kth<11>(), 56d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein r.kth<12>(), r.kth<13>(), r.kth<14>(), r.kth<15>()); 57d2ffd36eb62e99abe2920369d1e040954cc2044fmtklein} 588a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein 598a90edc2a58a4f8a4b4da73eb08e943be09538c0mtkleininline Sk4px Sk4px::alphas() const { 608a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein static_assert(SK_A32_SHIFT == 24, "This method assumes little-endian."); 618a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein return Sk16b(this->kth< 3>(), this->kth< 3>(), this->kth< 3>(), this->kth< 3>(), 628a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein this->kth< 7>(), this->kth< 7>(), this->kth< 7>(), this->kth< 7>(), 638a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein this->kth<11>(), this->kth<11>(), this->kth<11>(), this->kth<11>(), 648a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein this->kth<15>(), this->kth<15>(), this->kth<15>(), this->kth<15>()); 658a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein} 668a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein 678a90edc2a58a4f8a4b4da73eb08e943be09538c0mtkleininline Sk4px Sk4px::Load4Alphas(const SkAlpha a[4]) { 688a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein return Sk16b(a[0], a[0], a[0], a[0], 698a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein a[1], a[1], a[1], a[1], 708a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein a[2], a[2], a[2], a[2], 718a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein a[3], a[3], a[3], a[3]); 728a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein} 738a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein 748a90edc2a58a4f8a4b4da73eb08e943be09538c0mtkleininline Sk4px Sk4px::Load2Alphas(const SkAlpha a[2]) { 758a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein return Sk16b(a[0], a[0], a[0], a[0], 768a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein a[1], a[1], a[1], a[1], 778a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein 0,0,0,0, 788a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein 0,0,0,0); 798a90edc2a58a4f8a4b4da73eb08e943be09538c0mtklein} 800135a41e095a433414e21e37b277dab7dcbec373mtklein 810135a41e095a433414e21e37b277dab7dcbec373mtkleininline Sk4px Sk4px::zeroAlphas() const { 820135a41e095a433414e21e37b277dab7dcbec373mtklein static_assert(SK_A32_SHIFT == 24, "This method assumes little-endian."); 830135a41e095a433414e21e37b277dab7dcbec373mtklein return Sk16b(this->kth< 0>(), this->kth< 1>(), this->kth< 2>(), 0, 840135a41e095a433414e21e37b277dab7dcbec373mtklein this->kth< 4>(), this->kth< 5>(), this->kth< 6>(), 0, 850135a41e095a433414e21e37b277dab7dcbec373mtklein this->kth< 8>(), this->kth< 9>(), this->kth<10>(), 0, 860135a41e095a433414e21e37b277dab7dcbec373mtklein this->kth<12>(), this->kth<13>(), this->kth<14>(), 0); 870135a41e095a433414e21e37b277dab7dcbec373mtklein} 880135a41e095a433414e21e37b277dab7dcbec373mtklein 890135a41e095a433414e21e37b277dab7dcbec373mtkleininline Sk4px Sk4px::zeroColors() const { 900135a41e095a433414e21e37b277dab7dcbec373mtklein static_assert(SK_A32_SHIFT == 24, "This method assumes little-endian."); 910135a41e095a433414e21e37b277dab7dcbec373mtklein return Sk16b(0,0,0, this->kth< 3>(), 920135a41e095a433414e21e37b277dab7dcbec373mtklein 0,0,0, this->kth< 7>(), 930135a41e095a433414e21e37b277dab7dcbec373mtklein 0,0,0, this->kth<11>(), 940135a41e095a433414e21e37b277dab7dcbec373mtklein 0,0,0, this->kth<15>()); 950135a41e095a433414e21e37b277dab7dcbec373mtklein} 960135a41e095a433414e21e37b277dab7dcbec373mtklein 97