Merge pull request #10 from gunyarakun/fix-invalid-return
[cocotron.git] / Onyx2D / O2argb32f.h
blobd3804438f971b431c8a1322e41a2982c8f9c2698
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;
36 typedef struct {
37 O2Float32 a;
38 O2Float32 r;
39 O2Float32 g;
40 O2Float32 b;
41 } O2argb32f;
43 static inline O2argb32f O2argb32fInit(O2Float r, O2Float g, O2Float b, O2Float a) {
44 O2argb32f result;
45 result.r = r;
46 result.g = g;
47 result.b = b;
48 result.a = a;
49 return result;
52 static inline O2argb32f O2argb32fMultiplyByFloat(O2argb32f result, O2Float value) {
53 result.r *= value;
54 result.g *= value;
55 result.b *= value;
56 result.a *= value;
57 return result;
60 static inline O2argb32f O2argb32fAdd(O2argb32f result, O2argb32f other) {
61 result.r += other.r;
62 result.g += other.g;
63 result.b += other.b;
64 result.a += other.a;
65 return result;
68 static inline O2argb32f O2argb32fSubtract(O2argb32f result, O2argb32f other) {
69 result.r -= other.r;
70 result.g -= other.g;
71 result.b -= other.b;
72 result.a -= other.a;
73 return result;
76 static inline O2argb32f O2argb32fPremultiply(O2argb32f result) {
77 result.r *= result.a;
78 result.g *= result.a;
79 result.b *= result.a;
80 return 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);
87 return result;
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) {
99 O2argb8u result;
100 result.r = O2ByteFromFloat(rgba.r);
101 result.g = O2ByteFromFloat(rgba.g);
102 result.b = O2ByteFromFloat(rgba.b);
103 result.a = O2ByteFromFloat(rgba.a);
104 return result;
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);