19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this work for additional information regarding copyright ownership. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the "License"); you may not use this file except in compliance with 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Denis M. Kishenko 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$ 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage org.apache.harmony.awt.gl.render; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.MultiRectArea; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class JavaArcRasterizer { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds particular arc segment to mra 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX0LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x1 = 0; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x2 = line[i]; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = cy + (b - i); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x1 <= finish && x2 >= start) { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx + Math.max(x1, start), y, cx + Math.min(x2, finish), y); 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x1 = x2 + 1; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX1LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x1 = 0; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x2 = line[i]; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = cy - (b - i); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x1 <= finish && x2 >= start) { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx + Math.max(x1, start), y, cx + Math.min(x2, finish), y); 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x1 = x2 + 1; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX2LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x1 = 0; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x2 = line[i]; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = cy - (b - i); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x1 <= finish && x2 >= start) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx - Math.min(x2, finish), y, cx - Math.max(x1, start), y); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x1 = x2 + 1; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX3LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x1 = 0; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x2 = line[i]; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = cy + (b - i); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x1 <= finish && x2 >= start) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx - Math.min(x2, finish), y, cx - Math.max(x1, start), y); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x1 = x2 + 1; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY0LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y1 = 0; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = cx + (b - i); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y2 = line[i]; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y1 <= finish && y2 >= start) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(x, cy + Math.max(y1, start), x, cy + Math.min(y2, finish)); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y1 = y2 + 1; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY1LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y1 = 0; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = cx - (b - i); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y2 = line[i]; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y1 <= finish && y2 >= start) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(x, cy + Math.max(y1, start), x, cy + Math.min(y2, finish)); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y1 = y2 + 1; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY2LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y1 = 0; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = cx - (b - i); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y2 = line[i]; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y1 <= finish && y2 >= start) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(x, cy - Math.min(y2, finish), x, cy - Math.max(y1, start)); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y1 = y2 + 1; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY3LineSeg(MultiRectArea mra, int[] line, int cx, int cy, int b, int start, int finish) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y1 = 0; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = cx + (b - i); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y2 = line[i]; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y1 <= finish && y2 >= start) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(x, cy - Math.min(y2, finish), x, cy - Math.max(y1, start)); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y1 = y2 + 1; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX0Line(MultiRectArea mra, int[] line, int cx, int cy, int b) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx + prev, cy + (b - i), cx + line[i], cy + (b - i)); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX1Line(MultiRectArea mra, int[] line, int cx, int cy, int b) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx + prev, cy - (b - i), cx + line[i], cy - (b - i)); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX2Line(MultiRectArea mra, int[] line, int cx, int cy, int b) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx - line[i], cy - (b - i), cx - prev, cy - (b - i)); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addX3Line(MultiRectArea mra, int[] line, int cx, int cy, int b) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx - line[i], cy + (b - i), cx - prev, cy + (b - i)); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY0Line(MultiRectArea mra, int[] line, int cx, int cy, int a) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx + (a - i), cy + prev, cx + (a - i), cy + line[i]); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY1Line(MultiRectArea mra, int[] line, int cx, int cy, int a) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx - (a - i), cy + prev, cx - (a - i), cy + line[i]); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY2Line(MultiRectArea mra, int[] line, int cx, int cy, int a) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx - (a - i), cy - line[i], cx - (a - i), cy - prev); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addY3Line(MultiRectArea mra, int[] line, int cx, int cy, int a) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prev = 0; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < line.length; i++) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.addRect(cx + (a - i), cy - line[i], cx + (a - i), cy - prev); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prev = line[i] + 1; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns normalized angle (from 0 to 360 degrees) 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static double getNormAngle(double angle) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project angle -= Math.floor(angle / 360) * 360; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (angle < 0) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project angle += 360; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return angle; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates arc lookup table 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int[] createLine(int a, int b, int xcount, int ycount) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] buf = new int[b - ycount + 1]; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int d = a * a + 2 * b * b - 2 * a * a * b; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = 0; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = b; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (y >= ycount) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (d < 0) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = d + b * b * (4 * x + 6); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buf[b - y] = x; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = d + b * b * (4 * x + 6) + 4 * a * a * (1 - y); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y--; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x++; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buf; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds head/tail arc segment to MultiRectArea 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addSeg(MultiRectArea mra, int cx1, int cy1, int cx2, int cy2, int a, int b, int[] xline, int[] yline, int[] bounds) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(bounds[0]) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY3LineSeg(mra, yline, cx2, cy1, a, bounds[1], bounds[2]); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX1LineSeg(mra, xline, cx2, cy1, b, bounds[1], bounds[2]); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX2LineSeg(mra, xline, cx1, cy1, b, bounds[1], bounds[2]); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 3: 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY2LineSeg(mra, yline, cx1, cy1, a, bounds[1], bounds[2]); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 4: 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY1LineSeg(mra, yline, cx1, cy2, a, bounds[1], bounds[2]); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 5: 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX3LineSeg(mra, xline, cx1, cy2, b, bounds[1], bounds[2]); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 6: 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX0LineSeg(mra, xline, cx2, cy2, b, bounds[1], bounds[2]); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 7: 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY0LineSeg(mra, yline, cx2, cy2, a, bounds[1], bounds[2]); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns bounds for non quadratic arc head 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int[] getSegment1(double angle, int ax, int ay, int xcount, int ycount) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] bounds = new int[3]; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch((int)(angle / 90)) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount < ax) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 0; // Y3 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = -ay; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ycount; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 1; // X1 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ax; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount > -ax) { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 2; // X2 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = -ax; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = xcount; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 3; // Y2 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = -ay; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount < -ax) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 4; // Y1 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = ay; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ycount; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 5; // X3 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = -ax; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 3: 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount > ax) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 6; // X0 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = ax; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = xcount; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 7; // Y0 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ay; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bounds; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns bounds for non quadratic arc tail 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int[] getSegment2(double angle, int ax, int ay, int xcount, int ycount) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] bounds = new int[3]; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch((int)(angle / 90)) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount < ax) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 0; // Y3 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = -ay; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 1; // X1 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = ax; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = xcount; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount > -ax) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 2; // X2 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = -ax; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 3; // Y2 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = -ay; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ycount; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount < -ax) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 4; // Y1 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ay; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 5; // X3 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = -ax; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = xcount; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 3: 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xcount > ax) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 6; // X0 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = 0; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ax; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[0] = 7; // Y0 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[1] = ay; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds[2] = ycount; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bounds; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rasterizes arc using clippind and dashing style 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x1 - the x coordinate of the left-upper corner of the arc bounds 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y1 - the y coordinate of the left-upper corner of the arc bounds 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width - the width of the arc bounds 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height - the height of the arc bounds 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param angleStart - the start angle of the arc in degrees 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param angleExtent - the angle extent in degrees 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param clip - the MultiRectArea object of clipping area 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a MultiRectArea of rasterizer arc 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static MultiRectArea rasterize(int x, int y, int width, int height, double angleStart, double angleExtent, MultiRectArea clip) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MultiRectArea mra = new MultiRectArea(false); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cx1, cx2, cy1, cy2; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cx1 = cx2 = x + width / 2; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cy1 = cy2 = y + height / 2; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width % 2 == 0) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cx2--; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (height % 2 == 0) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cy2--; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int a = width / 2; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int b = height / 2; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double c = Math.sqrt(a * a + b * b); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int xcount, ycount; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a < b) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xcount = (int)Math.ceil(a * a / c); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ycount = (int)Math.floor(b * b / c); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xcount = (int)Math.floor(a * a / c); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ycount = (int)Math.ceil(b * b / c); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] xline = createLine(a, b, xcount, ycount); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] yline = createLine(b, a, ycount, xcount); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Correct lines 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = xline.length; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while(xline[--i] > xcount) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xline[i] = xcount; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = yline.length; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while(yline[--i] > ycount) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project yline[i] = ycount; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Math.abs(angleExtent) >= 360) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Rasterize CIRCLE 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX0Line(mra, xline, cx2, cy2, b); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX1Line(mra, xline, cx2, cy1, b); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX2Line(mra, xline, cx1, cy1, b); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX3Line(mra, xline, cx1, cy2, b); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY0Line(mra, yline, cx2, cy2, a); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY1Line(mra, yline, cx1, cy2, a); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY2Line(mra, yline, cx1, cy1, a); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY3Line(mra, yline, cx2, cy1, a); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Rasterize ARC 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project angleStart = getNormAngle(angleStart); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double angleFinish = getNormAngle(angleStart + angleExtent); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (angleExtent < 0) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double tmp = angleStart; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project angleStart = angleFinish; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project angleFinish = tmp; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double radStart = -Math.toRadians(angleStart); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double radFinish = -Math.toRadians(angleFinish); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ax1 = (int)(a * Math.cos(radStart)); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ay1 = (int)(b * Math.sin(radStart)); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ax2 = (int)(a * Math.cos(radFinish)); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ay2 = (int)(b * Math.sin(radFinish)); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] seg1 = getSegment1(angleStart, ax1, ay1, xcount, ycount); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] seg2 = getSegment2(angleFinish, ax2, ay2, xcount, ycount); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Start and Finish located in the same quater 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (angleStart < angleFinish && seg1[0] == seg2[0]) { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (seg1[0] % 2 == 0) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seg1[2] = seg2[2]; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project seg1[1] = seg2[1]; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addSeg(mra, cx1, cy1, cx2, cy2, a, b, xline, yline, seg1); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mra; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addSeg(mra, cx1, cy1, cx2, cy2, a, b, xline, yline, seg1); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addSeg(mra, cx1, cy1, cx2, cy2, a, b, xline, yline, seg2); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int startSeg = (seg1[0] + 1) % 8; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int finishSeg = seg2[0]; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (startSeg != finishSeg) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(startSeg) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 0: 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY3Line(mra, yline, cx2, cy1, a); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX1Line(mra, xline, cx2, cy1, b); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX2Line(mra, xline, cx1, cy1, b); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 3: 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY2Line(mra, yline, cx1, cy1, a); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 4: 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY1Line(mra, yline, cx1, cy2, a); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 5: 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX3Line(mra, xline, cx1, cy2, b); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 6: 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addX0Line(mra, xline, cx2, cy2, b); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 7: 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addY0Line(mra, yline, cx2, cy2, a); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startSeg = (startSeg + 1) % 8; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clip != null) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mra.intersect(clip); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mra; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}