| 141 | } |
| 142 | |
| 143 | void PiuSkinDraw(PiuSkin* self, PiuView* view, PiuRectangle bounds, PiuVariant variant, PiuState state, PiuAlignment horizontal, PiuAlignment vertical) |
| 144 | { |
| 145 | PiuFlags flags = (*self)->flags; |
| 146 | PiuColorRecord color; |
| 147 | if (state < 0) state = 0; |
| 148 | else if (3 < state) state = 3; |
| 149 | if (flags & piuSkinPattern) { |
| 150 | PiuState index = c_floor(state); |
| 151 | if (flags & piuSkinColorized) { |
| 152 | PiuColorsBlend((*self)->data.pattern.color, state, &color); |
| 153 | PiuViewPushColorFilter(view, &color); |
| 154 | PiuSkinDrawAux(self, view, bounds, variant, index, horizontal, vertical); |
| 155 | PiuViewPopColorFilter(view); |
| 156 | } |
| 157 | else { |
| 158 | color.r = color.g = color.b = 0; |
| 159 | color.a = 255; |
| 160 | PiuViewPushColor(view, &color); |
| 161 | PiuSkinDrawAux(self, view, bounds, variant, index, horizontal, vertical); |
| 162 | PiuViewPopColor(view); |
| 163 | if (index < state) { |
| 164 | color.a = (uint8_t)c_round((state - index) * 255.0); |
| 165 | PiuViewPushColor(view, &color); |
| 166 | PiuSkinDrawAux(self, view, bounds, variant, index + 1, horizontal, vertical); |
| 167 | PiuViewPopColor(view); |
| 168 | } |
| 169 | } |
| 170 | } |
| 171 | else { |
| 172 | PiuCoordinate x = bounds->x; |
| 173 | PiuCoordinate y = bounds->y; |
| 174 | PiuCoordinate dx = bounds->width; |
| 175 | PiuCoordinate dy = bounds->height; |
| 176 | PiuCoordinate dl = (*self)->data.color.borders.left; |
| 177 | PiuCoordinate dr = (*self)->data.color.borders.right; |
| 178 | PiuCoordinate dt = (*self)->data.color.borders.top; |
| 179 | PiuCoordinate db = (*self)->data.color.borders.bottom; |
| 180 | PiuColorsBlend((*self)->data.color.fill, state, &color); |
| 181 | PiuViewPushColor(view, &color); |
| 182 | PiuViewFillColor(view, x + dl, y + dt, dx - dl - dr, dy - dt - db); |
| 183 | PiuViewPopColor(view); |
| 184 | if (dl || dr || dt || db) { |
| 185 | PiuColorsBlend((*self)->data.color.stroke, state, &color); |
| 186 | PiuViewPushColor(view, &color); |
| 187 | if (dt) |
| 188 | PiuViewFillColor(view, x + dl, y, dx - dl, dt); |
| 189 | if (dr) |
| 190 | PiuViewFillColor(view, x + dx - dr, y + dt, dr, dy - dt); |
| 191 | if (db) |
| 192 | PiuViewFillColor(view, x, y + dy - db, dx - dr, db); |
| 193 | if (dl) |
| 194 | PiuViewFillColor(view, x, y, dl, dy - db); |
| 195 | PiuViewPopColor(view); |
| 196 | } |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | void PiuSkinDrawAux(PiuSkin* self, PiuView* view, PiuRectangle bounds, PiuVariant variant, PiuState state, PiuAlignment horizontal, PiuAlignment vertical) |
no test coverage detected