/* * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.java2d.pipe; /** * The API for an object that generates alpha coverage tiles for a given * path. * The {@link RenderingEngine} will be consulted as a factory to return * one of these objects for a given Shape and a given set of rendering * attributes. * This object will iterate through the bounds of the rendering primitive * and return tiles of a constant size as specified by the getTileWidth() * and getTileHeight() parameters. * The iteration order of the tiles will be as specified by the pseudo-code: * <pre> * int bbox[] = {left, top, right, bottom}; * AATileGenerator aatg = renderengine.getAATileGenerator(..., bbox); * int tw = aatg.getTileWidth(); * int th = aatg.getTileHeight(); * byte tile[] = new byte[tw * th]; * for (y = top; y < bottom; y += th) { * for (x = left; x < right; x += tw) { * int a = aatg.getTypicalAlpha(); * int w = Math.min(tw, right-x); * int h = Math.min(th, bottom-y); * if (a == 0x00) { * // can skip this tile... * aatg.nextTile(); * } else if (a == 0xff) { * // can treat this tile like a fillRect * aatg.nextTile(); * doFill(x, y, w, h); * } else { * aatg.getAlpha(tile, 0, tw); * handleAlpha(tile, x, y, w, h); * } * } * } * aatg.dispose(); * </pre> * The bounding box for the iteration will be returned by the * {@code RenderingEngine} via an argument to the getAATileGenerator() method. */ public interface AATileGenerator { /** * Gets the width of the tiles that the generator batches output into. * @return the width of the standard alpha tile */ public int getTileWidth(); /** * Gets the height of the tiles that the generator batches output into. * @return the height of the standard alpha tile */ public int getTileHeight(); /** * Gets the typical alpha value that will characterize the current * tile. * The answer may be 0x00 to indicate that the current tile has * no coverage in any of its pixels, or it may be 0xff to indicate * that the current tile is completely covered by the path, or any * other value to indicate non-trivial coverage cases. * @return 0x00 for no coverage, 0xff for total coverage, or any other * value for partial coverage of the tile */ public int getTypicalAlpha(); /** * Skips the current tile and moves on to the next tile. * Either this method, or the getAlpha() method should be called * once per tile, but not both. */ public void nextTile(); /** * Gets the alpha coverage values for the current tile. * Either this method, or the nextTile() method should be called * once per tile, but not both. */ public void getAlpha(byte tile[], int offset, int rowstride); /** * Disposes this tile generator. * No further calls will be made on this instance. */ public void dispose(); }