| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkHalf.h" | 8 #include "SkHalf.h" |
| 9 #include "SkPM4fPriv.h" | 9 #include "SkPM4fPriv.h" |
| 10 #include "SkUtils.h" | 10 #include "SkUtils.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 // | 43 // |
| 44 template <DstType D> Sk4f load_from_dst(uint64_t dst) { | 44 template <DstType D> Sk4f load_from_dst(uint64_t dst) { |
| 45 return (D == kU16_Dst) ? load_from_u16(dst) : SkHalfToFloat_01(dst); | 45 return (D == kU16_Dst) ? load_from_u16(dst) : SkHalfToFloat_01(dst); |
| 46 } | 46 } |
| 47 | 47 |
| 48 // Assumes x4 is already in the "natural" bias (either unit-float or 16bit int) | 48 // Assumes x4 is already in the "natural" bias (either unit-float or 16bit int) |
| 49 template <DstType D> uint64_t store_to_dst(const Sk4f& x4) { | 49 template <DstType D> uint64_t store_to_dst(const Sk4f& x4) { |
| 50 return (D == kU16_Dst) ? store_to_u16(x4) : SkFloatToHalf_01(x4); | 50 return (D == kU16_Dst) ? store_to_u16(x4) : SkFloatToHalf_01(x4); |
| 51 } | 51 } |
| 52 | 52 |
| 53 static inline Sk4f pm_to_rgba_order(const Sk4f& x) { | |
| 54 if (SkPM4f::R == 0) { | |
| 55 return x; // we're already RGBA | |
| 56 } else { | |
| 57 // we're BGRA, so swap R and B | |
| 58 return SkNx_shuffle<2, 1, 0, 3>(x); | |
| 59 } | |
| 60 } | |
| 61 | |
| 62 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 53 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 63 | 54 |
| 64 template <DstType D> void xfer_u64_1(const SkXfermode* xfer, uint64_t dst[], | 55 template <DstType D> void xfer_u64_1(const SkXfermode* xfer, uint64_t dst[], |
| 65 const SkPM4f* src, int count, const SkAlpha
aa[]) { | 56 const SkPM4f* src, int count, const SkAlpha
aa[]) { |
| 66 SkXfermodeProc4f proc = xfer->getProc4f(); | 57 SkXfermodeProc4f proc = xfer->getProc4f(); |
| 67 SkPM4f d; | 58 SkPM4f d; |
| 68 if (aa) { | 59 if (aa) { |
| 69 for (int i = 0; i < count; ++i) { | 60 for (int i = 0; i < count; ++i) { |
| 70 Sk4f d4 = bias_to_unit<D>(load_from_dst<D>(dst[i])); | 61 Sk4f d4 = bias_to_unit<D>(load_from_dst<D>(dst[i])); |
| 71 d4.store(d.fVec); | 62 d4.store(d.fVec); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 clear<kU16_Dst>, clear<kU16_Dst>, | 119 clear<kU16_Dst>, clear<kU16_Dst>, |
| 129 clear<kU16_Dst>, clear<kU16_Dst>, | 120 clear<kU16_Dst>, clear<kU16_Dst>, |
| 130 clear<kF16_Dst>, clear<kF16_Dst>, | 121 clear<kF16_Dst>, clear<kF16_Dst>, |
| 131 clear<kF16_Dst>, clear<kF16_Dst>, | 122 clear<kF16_Dst>, clear<kF16_Dst>, |
| 132 }; | 123 }; |
| 133 | 124 |
| 134 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 125 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 135 | 126 |
| 136 template <DstType D> void src_1(const SkXfermode*, uint64_t dst[], | 127 template <DstType D> void src_1(const SkXfermode*, uint64_t dst[], |
| 137 const SkPM4f* src, int count, const SkAlpha aa[]
) { | 128 const SkPM4f* src, int count, const SkAlpha aa[]
) { |
| 138 const Sk4f s4 = pm_to_rgba_order(unit_to_bias<D>(Sk4f::Load(src->fVec))); | 129 const Sk4f s4 = unit_to_bias<D>(Sk4f::Load(src->fVec)); |
| 139 if (aa) { | 130 if (aa) { |
| 140 for (int i = 0; i < count; ++i) { | 131 for (int i = 0; i < count; ++i) { |
| 141 const Sk4f d4 = load_from_dst<D>(dst[i]); | 132 const Sk4f d4 = load_from_dst<D>(dst[i]); |
| 142 dst[i] = store_to_dst<D>(lerp_by_coverage(s4, d4, aa[i])); | 133 dst[i] = store_to_dst<D>(lerp_by_coverage(s4, d4, aa[i])); |
| 143 } | 134 } |
| 144 } else { | 135 } else { |
| 145 sk_memset64(dst, store_to_dst<D>(s4), count); | 136 sk_memset64(dst, store_to_dst<D>(s4), count); |
| 146 } | 137 } |
| 147 } | 138 } |
| 148 | 139 |
| 149 template <DstType D> void src_n(const SkXfermode*, uint64_t dst[], | 140 template <DstType D> void src_n(const SkXfermode*, uint64_t dst[], |
| 150 const SkPM4f src[], int count, const SkAlpha aa[
]) { | 141 const SkPM4f src[], int count, const SkAlpha aa[
]) { |
| 151 if (aa) { | 142 if (aa) { |
| 152 for (int i = 0; i < count; ++i) { | 143 for (int i = 0; i < count; ++i) { |
| 153 const Sk4f s4 = pm_to_rgba_order(unit_to_bias<D>(Sk4f::Load(src[i].f
Vec))); | 144 const Sk4f s4 = unit_to_bias<D>(Sk4f::Load(src[i].fVec)); |
| 154 const Sk4f d4 = load_from_dst<D>(dst[i]); | 145 const Sk4f d4 = load_from_dst<D>(dst[i]); |
| 155 dst[i] = store_to_dst<D>(lerp_by_coverage(s4, d4, aa[i])); | 146 dst[i] = store_to_dst<D>(lerp_by_coverage(s4, d4, aa[i])); |
| 156 } | 147 } |
| 157 } else { | 148 } else { |
| 158 for (int i = 0; i < count; ++i) { | 149 for (int i = 0; i < count; ++i) { |
| 159 const Sk4f s4 = pm_to_rgba_order(unit_to_bias<D>(Sk4f::Load(src[i].f
Vec))); | 150 const Sk4f s4 = unit_to_bias<D>(Sk4f::Load(src[i].fVec)); |
| 160 dst[i] = store_to_dst<D>(s4); | 151 dst[i] = store_to_dst<D>(s4); |
| 161 } | 152 } |
| 162 } | 153 } |
| 163 } | 154 } |
| 164 | 155 |
| 165 const SkXfermode::D64Proc gProcs_Src[] = { | 156 const SkXfermode::D64Proc gProcs_Src[] = { |
| 166 src_n<kU16_Dst>, src_n<kU16_Dst>, | 157 src_n<kU16_Dst>, src_n<kU16_Dst>, |
| 167 src_1<kU16_Dst>, src_1<kU16_Dst>, | 158 src_1<kU16_Dst>, src_1<kU16_Dst>, |
| 168 src_n<kF16_Dst>, src_n<kF16_Dst>, | 159 src_n<kF16_Dst>, src_n<kF16_Dst>, |
| 169 src_1<kF16_Dst>, src_1<kF16_Dst>, | 160 src_1<kF16_Dst>, src_1<kF16_Dst>, |
| 170 }; | 161 }; |
| 171 | 162 |
| 172 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 163 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 173 | 164 |
| 174 static void dst(const SkXfermode*, uint64_t*, const SkPM4f*, int count, const Sk
Alpha[]) {} | 165 static void dst(const SkXfermode*, uint64_t*, const SkPM4f*, int count, const Sk
Alpha[]) {} |
| 175 | 166 |
| 176 const SkXfermode::D64Proc gProcs_Dst[] = { | 167 const SkXfermode::D64Proc gProcs_Dst[] = { |
| 177 dst, dst, dst, dst, dst, dst, dst, dst, | 168 dst, dst, dst, dst, dst, dst, dst, dst, |
| 178 }; | 169 }; |
| 179 | 170 |
| 180 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 171 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 181 | 172 |
| 182 template <DstType D> void srcover_1(const SkXfermode*, uint64_t dst[], | 173 template <DstType D> void srcover_1(const SkXfermode*, uint64_t dst[], |
| 183 const SkPM4f* src, int count, const SkAlpha
aa[]) { | 174 const SkPM4f* src, int count, const SkAlpha
aa[]) { |
| 184 const Sk4f s4 = pm_to_rgba_order(Sk4f::Load(src->fVec)); | 175 const Sk4f s4 = Sk4f::Load(src->fVec); |
| 185 const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); | 176 const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); |
| 186 const Sk4f s4bias = unit_to_bias<D>(s4); | 177 const Sk4f s4bias = unit_to_bias<D>(s4); |
| 187 for (int i = 0; i < count; ++i) { | 178 for (int i = 0; i < count; ++i) { |
| 188 const Sk4f d4bias = load_from_dst<D>(dst[i]); | 179 const Sk4f d4bias = load_from_dst<D>(dst[i]); |
| 189 const Sk4f r4bias = s4bias + d4bias * dst_scale; | 180 const Sk4f r4bias = s4bias + d4bias * dst_scale; |
| 190 if (aa) { | 181 if (aa) { |
| 191 dst[i] = store_to_dst<D>(lerp_by_coverage(r4bias, d4bias, aa[i])); | 182 dst[i] = store_to_dst<D>(lerp_by_coverage(r4bias, d4bias, aa[i])); |
| 192 } else { | 183 } else { |
| 193 dst[i] = store_to_dst<D>(r4bias); | 184 dst[i] = store_to_dst<D>(r4bias); |
| 194 } | 185 } |
| 195 } | 186 } |
| 196 } | 187 } |
| 197 | 188 |
| 198 template <DstType D> void srcover_n(const SkXfermode*, uint64_t dst[], | 189 template <DstType D> void srcover_n(const SkXfermode*, uint64_t dst[], |
| 199 const SkPM4f src[], int count, const SkAlpha
aa[]) { | 190 const SkPM4f src[], int count, const SkAlpha
aa[]) { |
| 200 for (int i = 0; i < count; ++i) { | 191 for (int i = 0; i < count; ++i) { |
| 201 const Sk4f s4 = pm_to_rgba_order(Sk4f::Load(src[i].fVec)); | 192 const Sk4f s4 = Sk4f::Load(src[i].fVec); |
| 202 const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); | 193 const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); |
| 203 const Sk4f s4bias = unit_to_bias<D>(s4); | 194 const Sk4f s4bias = unit_to_bias<D>(s4); |
| 204 const Sk4f d4bias = load_from_dst<D>(dst[i]); | 195 const Sk4f d4bias = load_from_dst<D>(dst[i]); |
| 205 const Sk4f r4bias = s4bias + d4bias * dst_scale; | 196 const Sk4f r4bias = s4bias + d4bias * dst_scale; |
| 206 if (aa) { | 197 if (aa) { |
| 207 dst[i] = store_to_dst<D>(lerp_by_coverage(r4bias, d4bias, aa[i])); | 198 dst[i] = store_to_dst<D>(lerp_by_coverage(r4bias, d4bias, aa[i])); |
| 208 } else { | 199 } else { |
| 209 dst[i] = store_to_dst<D>(r4bias); | 200 dst[i] = store_to_dst<D>(r4bias); |
| 210 } | 201 } |
| 211 } | 202 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 239 SkASSERT(0 == (flags & ~7)); | 230 SkASSERT(0 == (flags & ~7)); |
| 240 flags &= 7; | 231 flags &= 7; |
| 241 | 232 |
| 242 Mode mode; | 233 Mode mode; |
| 243 return this->asMode(&mode) ? find_proc(mode, flags) : gProcs_General[flags]; | 234 return this->asMode(&mode) ? find_proc(mode, flags) : gProcs_General[flags]; |
| 244 } | 235 } |
| 245 | 236 |
| 246 SkXfermode::D64Proc SkXfermode::GetD64Proc(SkXfermode* xfer, uint32_t flags) { | 237 SkXfermode::D64Proc SkXfermode::GetD64Proc(SkXfermode* xfer, uint32_t flags) { |
| 247 return xfer ? xfer->onGetD64Proc(flags) : find_proc(SkXfermode::kSrcOver_Mod
e, flags); | 238 return xfer ? xfer->onGetD64Proc(flags) : find_proc(SkXfermode::kSrcOver_Mod
e, flags); |
| 248 } | 239 } |
| OLD | NEW |