1 /*------------------------------------------------------------------------
3 * Derivative of the OpenVG 1.0.1 Reference Implementation
4 * -------------------------------------
6 * Copyright (c) 2007 The Khronos Group Inc.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and /or associated documentation files
10 * (the "Materials "), to deal in the Materials without restriction,
11 * including without limitation the rights to use, copy, modify, merge,
12 * publish, distribute, sublicense, and/or sell copies of the Materials,
13 * and to permit persons to whom the Materials are furnished to do so,
14 * subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Materials.
19 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
23 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
25 * THE USE OR OTHER DEALINGS IN THE MATERIALS.
27 *-------------------------------------------------------------------*/
29 #import <Foundation/NSObject.h>
30 #import <Onyx2D/O2Geometry.h>
31 #import <Onyx2D/VGmath.h>
32 #import <Onyx2D/O2argb8u.h>
34 typedef float O2Float32
;
43 static inline O2argb32f
O2argb32fInit(O2Float r
, O2Float g
, O2Float b
, O2Float a
) {
52 static inline O2argb32f
O2argb32fMultiplyByFloat(O2argb32f result
, O2Float value
) {
60 static inline O2argb32f
O2argb32fAdd(O2argb32f result
, O2argb32f other
) {
68 static inline O2argb32f
O2argb32fSubtract(O2argb32f result
, O2argb32f other
) {
76 static inline O2argb32f
O2argb32fPremultiply(O2argb32f result
) {
82 static inline O2argb32f
O2argb32fClamp(O2argb32f result
) {
83 result
.r
= RI_CLAMP(result
.r
, 0.0f
, 1.0f
);
84 result
.g
= RI_CLAMP(result
.g
, 0.0f
, 1.0f
);
85 result
.b
= RI_CLAMP(result
.b
, 0.0f
, 1.0f
);
86 result
.a
= RI_CLAMP(result
.a
, 0.0f
, 1.0f
);
90 static inline O2Float
O2Float32FromByte(uint8_t i
) {
91 return (O2Float
)(i
) / (O2Float
)0xFF;
94 static inline uint8_t O2ByteFromFloat(O2Float c
) {
95 return RI_INT_MIN(RI_INT_MAX(RI_FLOOR_TO_INT(c
* (O2Float
)0xFF + 0.5f
), 0), 0xFF);
98 static inline O2argb8u
O2argb8uFromO2argb32f(O2argb32f rgba
) {
100 result
.r
= O2ByteFromFloat(rgba
.r
);
101 result
.g
= O2ByteFromFloat(rgba
.g
);
102 result
.b
= O2ByteFromFloat(rgba
.b
);
103 result
.a
= O2ByteFromFloat(rgba
.a
);
107 #define COVERAGE_MULTIPLIER_FLOAT 256.0f
109 static inline O2Float
zeroToOneFromCoverage(unsigned coverage
) {
110 return (O2Float
)coverage
/ COVERAGE_MULTIPLIER_FLOAT
;
113 static inline uint32_t coverageFromZeroToOne(O2Float value
) {
114 return value
* COVERAGE_MULTIPLIER_FLOAT
;
117 void O2BlendSpanNormal_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
118 void O2BlendSpanMultiply_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
119 void O2BlendSpanScreen_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
120 void O2BlendSpanOverlay_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
121 void O2BlendSpanDarken_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
122 void O2BlendSpanLighten_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
123 void O2BlendSpanColorDodge_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
124 void O2BlendSpanColorBurn_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
125 void O2BlendSpanHardLight_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
126 void O2BlendSpanSoftLight_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
127 void O2BlendSpanDifference_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
128 void O2BlendSpanExclusion_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
129 void O2BlendSpanHue_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
130 void O2BlendSpanSaturation_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
131 void O2BlendSpanColor_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
132 void O2BlendSpanLuminosity_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
133 void O2BlendSpanClear_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
134 void O2BlendSpanCopy_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
135 void O2BlendSpanSourceIn_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
136 void O2BlendSpanSourceOut_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
137 void O2BlendSpanSourceAtop_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
138 void O2BlendSpanDestinationOver_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
139 void O2BlendSpanDestinationIn_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
140 void O2BlendSpanDestinationOut_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
141 void O2BlendSpanDestinationAtop_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
142 void O2BlendSpanXOR_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
143 void O2BlendSpanPlusDarker_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);
144 void O2BlendSpanPlusLighter_ffff(O2argb32f
*src
, O2argb32f
*dst
, int length
);