11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* -*- Mode: c; c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t; -*- */ 21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright © 2000 SuSE, Inc. 41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright © 2007 Red Hat, Inc. 51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. 61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 2005 Lars Knoll & Zack Rusin, Trolltech 71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Permission to use, copy, modify, distribute, and sell this software and its 91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * documentation for any purpose is hereby granted without fee, provided that 101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * the above copyright notice appear in all copies and that both that 111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * copyright notice and this permission notice appear in supporting 121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * documentation, and that the name of Keith Packard not be used in 131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * advertising or publicity pertaining to distribution of the software without 141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * specific, written prior permission. Keith Packard makes no 151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * representations about the suitability of this software for any purpose. It 161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * is provided "as is" without express or implied warranty. 171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY 211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * SOFTWARE. 261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#ifdef HAVE_CONFIG_H 291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <config.h> 301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif 311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h> 321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "pixman-private.h" 331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 341176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_bool_t 351176bdada62cabc6ec4b0308a930e83b679d5d36John Recklinear_gradient_is_horizontal (pixman_image_t *image, 361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int x, 371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int y, 381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int width, 391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int height) 401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear_gradient_t *linear = (linear_gradient_t *)image; 421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_vector_t v; 431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_32_32_t l; 441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_48_16_t dx, dy; 451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck double inc; 461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->common.transform) 481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* projective transformation */ 501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->common.transform->matrix[2][0] != 0 || 511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck image->common.transform->matrix[2][1] != 0 || 521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck image->common.transform->matrix[2][2] == 0) 531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return FALSE; 551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[0] = image->common.transform->matrix[0][1]; 581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[1] = image->common.transform->matrix[1][1]; 591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[2] = image->common.transform->matrix[2][2]; 601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[0] = 0; 641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[1] = pixman_fixed_1; 651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[2] = pixman_fixed_1; 661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dx = linear->p2.x - linear->p1.x; 691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dy = linear->p2.y - linear->p1.y; 701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck l = dx * dx + dy * dy; 721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (l == 0) 741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return FALSE; 751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* 771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * compute how much the input of the gradient walked changes 781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * when moving vertically through the whole image 791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck inc = height * (double) pixman_fixed_1 * pixman_fixed_1 * 811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (dx * v.vector[0] + dy * v.vector[1]) / 821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (v.vector[2] * (double) l); 831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* check that casting to integer would result in 0 */ 851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (-1 < inc && inc < 1) 861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return TRUE; 871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return FALSE; 891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 911176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t * 921176bdada62cabc6ec4b0308a930e83b679d5d36John Recklinear_get_scanline_narrow (pixman_iter_t *iter, 931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck const uint32_t *mask) 941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *image = iter->image; 961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int x = iter->x; 971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int y = iter->y; 981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int width = iter->width; 991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t * buffer = iter->buffer; 1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_vector_t v, unit; 1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_32_32_t l; 1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_48_16_t dx, dy; 1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck gradient_t *gradient = (gradient_t *)image; 1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear_gradient_t *linear = (linear_gradient_t *)image; 1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *end = buffer + width; 1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_gradient_walker_t walker; 1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck _pixman_gradient_walker_init (&walker, gradient, image->common.repeat); 1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* reference point is the center of the pixel */ 1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[0] = pixman_int_to_fixed (x) + pixman_fixed_1 / 2; 1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[1] = pixman_int_to_fixed (y) + pixman_fixed_1 / 2; 1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[2] = pixman_fixed_1; 1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (image->common.transform) 1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!pixman_transform_point_3d (image->common.transform, &v)) 1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return iter->buffer; 1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck unit.vector[0] = image->common.transform->matrix[0][0]; 1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck unit.vector[1] = image->common.transform->matrix[1][0]; 1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck unit.vector[2] = image->common.transform->matrix[2][0]; 1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck unit.vector[0] = pixman_fixed_1; 1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck unit.vector[1] = 0; 1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck unit.vector[2] = 0; 1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dx = linear->p2.x - linear->p1.x; 1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dy = linear->p2.y - linear->p1.y; 1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck l = dx * dx + dy * dy; 1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (l == 0 || unit.vector[2] == 0) 1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* affine transformation only */ 1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_fixed_32_32_t t, next_inc; 1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck double inc; 1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (l == 0 || v.vector[2] == 0) 1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t = 0; 1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck inc = 0; 1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck double invden, v2; 1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck invden = pixman_fixed_1 * (double) pixman_fixed_1 / 1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (l * (double) v.vector[2]); 1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v2 = v.vector[2] * (1. / pixman_fixed_1); 1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t = ((dx * v.vector[0] + dy * v.vector[1]) - 1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (dx * linear->p1.x + dy * linear->p1.y) * v2) * invden; 1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck inc = (dx * unit.vector[0] + dy * unit.vector[1]) * invden; 1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck next_inc = 0; 1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (((pixman_fixed_32_32_t )(inc * width)) == 0) 1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck register uint32_t color; 1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck color = _pixman_gradient_walker_pixel (&walker, t); 1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while (buffer < end) 1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *buffer++ = color; 1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 1701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 1721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck i = 0; 1741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while (buffer < end) 1751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!mask || *mask++) 1771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *buffer = _pixman_gradient_walker_pixel (&walker, 1791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t + next_inc); 1801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck i++; 1821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck next_inc = inc * i; 1831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck buffer++; 1841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 1871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 1881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* projective transformation */ 1901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck double t; 1911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t = 0; 1931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while (buffer < end) 1951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!mask || *mask++) 1971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 1981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (v.vector[2] != 0) 1991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck double invden, v2; 2011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck invden = pixman_fixed_1 * (double) pixman_fixed_1 / 2031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (l * (double) v.vector[2]); 2041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v2 = v.vector[2] * (1. / pixman_fixed_1); 2051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck t = ((dx * v.vector[0] + dy * v.vector[1]) - 2061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (dx * linear->p1.x + dy * linear->p1.y) * v2) * invden; 2071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck *buffer = _pixman_gradient_walker_pixel (&walker, t); 2101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck ++buffer; 2131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[0] += unit.vector[0]; 2151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[1] += unit.vector[1]; 2161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck v.vector[2] += unit.vector[2]; 2171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck iter->y++; 2211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return iter->buffer; 2231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 2241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2251176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t * 2261176bdada62cabc6ec4b0308a930e83b679d5d36John Recklinear_get_scanline_wide (pixman_iter_t *iter, const uint32_t *mask) 2271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *buffer = linear_get_scanline_narrow (iter, NULL); 2291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_expand_to_float ( 2311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (argb_t *)buffer, buffer, PIXMAN_a8r8g8b8, iter->width); 2321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return buffer; 2341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 2351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2361176bdada62cabc6ec4b0308a930e83b679d5d36John Reckvoid 2371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck_pixman_linear_gradient_iter_init (pixman_image_t *image, pixman_iter_t *iter) 2381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (linear_gradient_is_horizontal ( 2401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck iter->image, iter->x, iter->y, iter->width, iter->height)) 2411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (iter->iter_flags & ITER_NARROW) 2431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear_get_scanline_narrow (iter, NULL); 2441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear_get_scanline_wide (iter, NULL); 2461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck iter->get_scanline = _pixman_iter_get_scanline_noop; 2481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (iter->iter_flags & ITER_NARROW) 2521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck iter->get_scanline = linear_get_scanline_narrow; 2531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck iter->get_scanline = linear_get_scanline_wide; 2551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 2571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2581176bdada62cabc6ec4b0308a930e83b679d5d36John ReckPIXMAN_EXPORT pixman_image_t * 2591176bdada62cabc6ec4b0308a930e83b679d5d36John Reckpixman_image_create_linear_gradient (const pixman_point_fixed_t * p1, 2601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck const pixman_point_fixed_t * p2, 2611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck const pixman_gradient_stop_t *stops, 2621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n_stops) 2631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *image; 2651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear_gradient_t *linear; 2661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck image = _pixman_image_allocate (); 2681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!image) 2701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 2711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear = &image->linear; 2731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (!_pixman_init_gradient (&linear->common, stops, n_stops)) 2751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (image); 2771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return NULL; 2781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear->p1 = *p1; 2811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck linear->p2 = *p2; 2821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck image->type = LINEAR; 2841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return image; 2861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 2871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 288