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 Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class JavaLineRasterizer { 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * LineDasher class provides dashing for particular dash style 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LineDasher { 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float pos; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float phase; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float dash[]; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float inv[]; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean visible; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LineDasher() { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LineDasher(float dash[], float phase) { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dash = dash; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.phase = phase; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inv = new float[dash.length]; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int j = dash.length; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (float element : dash) { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inv[--j] = element; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = 0; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (phase > dash[index]) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phase -= dash[index]; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = (index + 1) % dash.length; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visible = index % 2 == 0; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void move(float step) { // main dasher 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += step; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project step += phase; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while(step >= dash[index]) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project step -= dash[index]; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = (index + 1) % dash.length; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visible = !visible; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phase = step; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float nextDash() { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phase = 0.0f; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = (index + 1) % dash.length; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visible = !visible; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dash[index]; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher createDiagonal(double k, float length, boolean invert) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher local = new LineDasher(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.dash = new float[dash.length]; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (invert) { // inverted dasher 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project move(length); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.phase = (float)((dash[index] - phase) * k); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.visible = visible; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.index = inv.length - index - 1; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < inv.length; i++) { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.dash[i] = (float)(inv[i] * k); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.phase = (float)(phase * k); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.visible = visible; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.index = index; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 0; i < dash.length; i++) { 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.dash[i] = (float)(dash[i] * k); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project move(length); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return local; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher createOrtogonal(float length, boolean invert) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher local = new LineDasher(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.dash = new float[dash.length]; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (invert) { // inverted dasher 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project move(length); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.phase = dash[index] - phase; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.visible = visible; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.index = inv.length - index - 1; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.dash = inv; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.phase = phase; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.visible = visible; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.index = index; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local.dash = dash; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project move(length); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return local; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher createChild(float start) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher child = new LineDasher(); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.phase = phase; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.visible = visible; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.index = index; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.dash = dash; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.move(start); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return child; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Line class provides rasterization for different line types 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abstract static class Line { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x1, y1, x2, y2; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x, y; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MultiRectArea dst; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Line(int x1, int y1, int x2, int y2, MultiRectArea dst) { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.x1 = x1; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.y1 = y1; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.x2 = x2; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.y2 = y2; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.dst = dst; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static abstract class Diag extends Line { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dx, dy, adx, ady, sx, sy; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int eBase, ePos, eNeg; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int xcount; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int e; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Diag(int x1, int y1, int x2, int y2, MultiRectArea dst) { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx = x2 - x1; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy = y2 - y1; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sy = 1; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx > 0) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project adx = dx; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sx = 1; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project adx = -dx; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sx = -1; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ady = dy; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float getLength() { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (float)Math.sqrt(dx * dx + dy * dy); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class Hor extends Diag { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Hor(int x1, int y1, int x2, int y2, MultiRectArea dst) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eBase = ady + ady - adx; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ePos = 2 * (ady - adx); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eNeg = ady + ady; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xcount = adx; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(xcount); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int nx1, int ny1, int nx2, int ny2) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase + 2 * (ady * Math.abs(nx1 - x1) - adx * Math.abs(ny1 - y1)); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = nx1; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = ny1; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(dx > 0 ? nx2 - nx1 : nx1 - nx2); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int count) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int px = x; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (count-- > 0) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e >= 0) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sx > 0) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(px, y, x, y); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x, y, px, y); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += sx; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += sy; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += ePos; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project px = x; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += eNeg; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += sx; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sx > 0) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(px, y, x, y); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x, y, px, y); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void skip(int count) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (count-- > 0) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += sx; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e >= 0) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += sy; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += ePos; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += eNeg; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class Ver extends Diag { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Ver(int x1, int y1, int x2, int y2, MultiRectArea dst) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eBase = adx + adx - ady; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ePos = 2 * (adx - ady); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eNeg = adx + adx; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xcount = ady; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(xcount); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int nx1, int ny1, int nx2, int ny2) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase + 2 * (adx * Math.abs(ny1 - y1) - ady * Math.abs(nx1 - x1)); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = nx1; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = ny1; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(ny2 - ny1); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int count) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int py = y; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (count-- > 0) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e >= 0) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x, py, x, y); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += sx; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += sy; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += ePos; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project py = y; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += sy; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += eNeg; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x, py, x, y); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void skip(int count) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (count-- > 0) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += sy; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e >= 0) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += sx; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += ePos; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e += eNeg; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class HorDashed extends Hor { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher local; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HorDashed(int x1, int y1, int x2, int y2, MultiRectArea dst, LineDasher dasher, boolean invert) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float length = getLength(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local = dasher.createDiagonal(xcount / length, length, invert); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(xcount, local); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int nx1, int ny1, int nx2, int ny2) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase + 2 * (ady * Math.abs(nx1 - x1) - adx * Math.abs(ny1 - y1)); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = nx1; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = ny1; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(Math.abs(nx2 - nx1), local.createChild(Math.abs(nx1 - x1))); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class VerDashed extends Ver { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher local; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VerDashed(int x1, int y1, int x2, int y2, MultiRectArea dst, LineDasher dasher, boolean invert) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float length = getLength(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local = dasher.createDiagonal(xcount / length, length, invert); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(xcount, local); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int nx1, int ny1, int nx2, int ny2) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project e = eBase + 2 * (adx * Math.abs(ny1 - y1) - ady * Math.abs(nx1 - x1)); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = nx1; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = ny1; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(ny2 - ny1, local.createChild(ny1 - y1)); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int[] clip, int index) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cx1 = clip[index + 0]; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cy1 = clip[index + 1]; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cx2 = clip[index + 2] + 1; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cy2 = clip[index + 3] + 1; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code1 = 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (x1 < cx1 ? 1 : 0) | (x1 >= cx2 ? 2 : 0) | 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (y1 < cy1 ? 8 : 0) | (y1 >= cy2 ? 4 : 0); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code2 = 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (x2 < cx1 ? 1 : 0) | (x2 >= cx2 ? 2 : 0) | 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (y2 < cy1 ? 8 : 0) | (y2 >= cy2 ? 4 : 0); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Outside 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((code1 & code2) != 0) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inside 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code1 == 0 && code2 == 0) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clip 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nx1 = x1; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ny1 = y1; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nx2 = x2; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ny2 = y2; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need to clip 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cx1 -= x1; cx2 -= x1; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cy1 -= y1; cy2 -= y1; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// int d; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newx1 = 0, newy1 = 0, newx2 = 0, newy2 = 0; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code1 != 0) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx1 = Integer.MAX_VALUE; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((code1 & 8) != 0) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 1 with top clip bound 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy1 = cy1; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx1 = clipY(dx, dy, newy1, true); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((code1 & 4) != 0) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 1 with bottom clip bound 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy1 = cy2 - 1; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx1 = clipY(dx, dy, newy1, false); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((code1 & 1) != 0 && (cx1 > newx1 || newx1 == Integer.MAX_VALUE)) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 1 with left clip bound 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx1 = cx1; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy1 = clipX(dx, dy, newx1, false); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((code1 & 2) != 0 && (newx1 >= cx2 || newx1 == Integer.MAX_VALUE)) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 1 with right clip bound 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx1 = cx2 - 1; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy1 = clipX(dx, dy, newx1, false); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newx1 < cx1 || newx1 >= cx2 || newy1 < cy1 || newy1 >= cy2) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// d = 2 * (ady * Math.abs(newx1) - adx * Math.abs(newy1)) + 2 * ady - adx; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// d = (ady << 1) - adx; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code2 != 0) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx2=Integer.MAX_VALUE; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((code2 & 8) != 0) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 2 with top clip bound 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy2 = cy1; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx2 = clipY(dx, dy, newy2, true); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((code2 & 4) != 0) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 2 with bottom clip bound 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy2 = cy2 - 1; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx2 = clipY(dx, dy, newy2, false); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((code2 & 1) != 0 && (cx1 > newx2 || newx2 == Integer.MAX_VALUE)) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 2 with left clip bound 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx2 = cx1; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy2 = clipX(dx, dy, newx2, false); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((code2 & 2) != 0 && (newx2 >= cx2 || newx2 == Integer.MAX_VALUE)) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clip point 2 with right clip bound 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newx2 = cx2 - 1; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newy2 = clipX(dx, dy, newx2, false); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newx2 < cx1 || newx2 >= cx2 || newy2 < cy1 || newy2 >= cy2) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nx2 = x1 + newx2; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ny2 = y1 + newy2; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nx1 = x1 + newx1; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ny1 = y1 + newy1; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeClipped(nx1, ny1, nx2, ny2); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abstract void rasterizeClipped(int nx1, int ny1, int nx2, int ny2); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static abstract class Ortog extends Line { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Ortog(int x1, int y1, int x2, int y2, MultiRectArea dst) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class Hor extends Ortog { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dx; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Hor(int x1, int y1, int x2, int y2, MultiRectArea dst) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx = x2 - x1; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx > 0) { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x1, y1, x2, y2); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x2, y2, x1, y1); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int step) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int px = x; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx > 0) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += step; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(px, y1, x - 1, y2); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x -= step; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x + 1, y2, px, y1); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void skip(int step) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx > 0) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x += step; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x -= step; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int nx1, int nx2) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nx1 < nx2) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(nx1, y1, nx2, y1); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(nx2, y1, nx1, y1); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int[] clip, int index) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y1 >= clip[index + 1] && y1 <= clip[index + 3]) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cx1 = clip[index + 0]; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cx2 = clip[index + 2]; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x1 <= cx2 && x2 >= cx1) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nx1, nx2; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx > 0) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nx1 = Math.max(x1, cx1); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nx2 = Math.min(x2, cx2); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nx2 = Math.max(x2, cx1); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nx1 = Math.min(x1, cx2); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeClipped(nx1, nx2); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class Ver extends Ortog { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dy; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Ver(int x1, int y1, int x2, int y2, MultiRectArea dst) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy = y2 - y1; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x1, y1, x2, y2); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int step) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int py = y; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += step; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x1, py, x2, y - 1); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void skip(int step) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y += step; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int ny1, int ny2) { 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.addRect(x1, ny1, x1, ny2); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize(int[] clip, int index) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (x1 >= clip[index] && x1 <= clip[index + 2]) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cy1 = clip[index + 1]; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cy2 = clip[index + 3]; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (y1 <= cy2 && y2 >= cy1) { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeClipped(Math.max(y1, cy1), Math.min(y2, cy2)); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class HorDashed extends Hor { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher local; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HorDashed(int x1, int y1, int x2, int y2, MultiRectArea dst, LineDasher dasher) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dx = x2 - x1; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local = dasher.createOrtogonal(Math.abs(dx), false); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(Math.abs(dx), local); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int nx1, int nx2) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = nx1; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(Math.abs(nx2 - nx1), local.createChild(Math.abs(nx1 - x1))); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static class VerDashed extends Ver { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LineDasher local; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project VerDashed(int x1, int y1, int x2, int y2, MultiRectArea dst, LineDasher dasher, boolean invert) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(x1, y1, x2, y2, dst); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dy = y2 - y1; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project local = dasher.createOrtogonal(dy, invert); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterize() { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = y1; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(dy, local); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeClipped(int ny1, int ny2) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project x = x1; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project y = ny1; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterizeDash(ny2 - ny1, local.createChild(ny1)); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abstract void rasterize(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abstract void rasterize(int[] clip, int index); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abstract void rasterize(int count); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project abstract void skip(int count); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void rasterizeDash(int count, LineDasher dasher) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float delta = dasher.dash[dasher.index] - dasher.phase; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int step = (int)delta; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delta -= step; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while(count > step) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dasher.visible) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(step); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project skip(step); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count -= step; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delta += dasher.nextDash(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project step = (int)delta; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delta -= step; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count > 0 && dasher.visible) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rasterize(count); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dasher.move(count); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Common clipping method 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int clip(int dX1, int dX2, int cX, boolean top) { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int adX1 = dX1 < 0 ? -dX1 : dX1; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int adX2 = dX2 < 0 ? -dX2 : dX2; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (adX1 <= adX2) { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // obtuse intersection angle 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((dX1 << 1) * cX + (dX1 > 0 ? dX2 : -dX2)) / (dX2 << 1); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int k; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (top) { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project k = -dX1 + (dX2 < 0 ? 0 : dX1 > 0 ? (dX2 << 1) : -(dX2 << 1)); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project k = dX1 + (dX2 > 0 ? 0 : dX1 > 0 ? (dX2 << 1) : -(dX2 << 1)); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project k += dX1 > 0 == dX2 > 0 ? -1 : 1; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((dX1 << 1) * cX + k) / (dX2 << 1); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clipping along X axis 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int clipX(int dx, int dy, int cy, boolean top) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clip(dy, dx, cy, top); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clipping along Y axis 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int clipY(int dx, int dy, int cx, boolean top) { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clip(dx, dy, cx, top); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Rasterizes line using clippind and dashing style 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x1 - the x coordinate of the first control point 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y1 - the y coordinate of the first control point 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x2 - the x coordinate of the second control point 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y2 - the y coordinate of the second control point 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param clip - the MultiRectArea object of clipping area 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dasher - the dasher style 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param invert - the invert indicator, always false 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a MultiRectArea of rasterizer line 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static MultiRectArea rasterize(int x1, int y1, int x2, int y2, MultiRectArea clip, LineDasher dasher, boolean invert) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MultiRectArea dst = new MultiRectArea(false); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dx = x2 - x1; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dy = y2 - y1; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Point 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx == 0 && dy == 0) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((clip == null || clip.contains(x1, y1)) && (dasher == null || dasher.visible)) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst = new MultiRectArea(x1, y1, x1, y1); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dy < 0) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rasterize(x2, y2, x1, y1, clip, dasher, true); 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Line line; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dasher == null) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx == 0) { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Ortog.Ver(x1, y1, x2, y2, dst); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dy == 0) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Ortog.Hor(x1, y1, x2, y2, dst); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dy < Math.abs(dx)) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Diag.Hor(x1, y1, x2, y2, dst); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Diag.Ver(x1, y1, x2, y2, dst); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dx == 0) { 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Ortog.VerDashed(x1, y1, x2, y2, dst, dasher, invert); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dy == 0) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Ortog.HorDashed(x1, y1, x2, y2, dst, dasher); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dy < Math.abs(dx)) { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Diag.HorDashed(x1, y1, x2, y2, dst, dasher, invert); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line = new Line.Diag.VerDashed(x1, y1, x2, y2, dst, dasher, invert); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clip == null || clip.isEmpty()) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line.rasterize(); 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for(int i = 1; i < clip.rect[0]; i += 4) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project line.rasterize(clip.rect, i); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 761