OLD | NEW |
| (Empty) |
1 | |
2 /* | |
3 * Copyright 2011 Google Inc. | |
4 * | |
5 * Use of this source code is governed by a BSD-style license that can be | |
6 * found in the LICENSE file. | |
7 */ | |
8 #include "SkUnitMappers.h" | |
9 #include "SkReadBuffer.h" | |
10 #include "SkWriteBuffer.h" | |
11 | |
12 | |
13 SkDiscreteMapper::SkDiscreteMapper(int segments) { | |
14 if (segments < 2) { | |
15 fSegments = 0; | |
16 fScale = 0; | |
17 } else { | |
18 if (segments > 0xFFFF) { | |
19 segments = 0xFFFF; | |
20 } | |
21 fSegments = segments; | |
22 fScale = (1 << 30) / (segments - 1); | |
23 } | |
24 } | |
25 | |
26 uint16_t SkDiscreteMapper::mapUnit16(uint16_t input) { | |
27 SkFixed x = input * fSegments >> 16; | |
28 x = x * fScale >> 14; | |
29 x += x << 15 >> 31; // map 0x10000 to 0xFFFF | |
30 return SkToU16(x); | |
31 } | |
32 | |
33 SkDiscreteMapper::SkDiscreteMapper(SkReadBuffer& rb) | |
34 : SkUnitMapper(rb) { | |
35 fSegments = rb.readInt(); | |
36 fScale = rb.read32(); | |
37 } | |
38 | |
39 void SkDiscreteMapper::flatten(SkWriteBuffer& wb) const { | |
40 this->INHERITED::flatten(wb); | |
41 | |
42 wb.writeInt(fSegments); | |
43 wb.write32(fScale); | |
44 } | |
45 | |
46 /////////////////////////////////////////////////////////////////////////////// | |
47 | |
48 uint16_t SkCosineMapper::mapUnit16(uint16_t input) | |
49 { | |
50 /* we want to call cosine(input * pi/2) treating input as [0...1) | |
51 however, the straight multitply would overflow 32bits since input is | |
52 16bits and pi/2 is 17bits, so we shift down our pi const before we mul | |
53 */ | |
54 SkFixed rads = (unsigned)(input * (SK_FixedPI >> 2)) >> 15; | |
55 SkFixed x = SkFixedCos(rads); | |
56 x += x << 15 >> 31; // map 0x10000 to 0xFFFF | |
57 return SkToU16(x); | |
58 } | |
59 | |
60 SkCosineMapper::SkCosineMapper(SkReadBuffer& rb) | |
61 : SkUnitMapper(rb) {} | |
OLD | NEW |