1c3683b552f592d8039a466c663f7de8c8286e975Chris Craik/*
2c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * Copyright (C) 2012 The Android Open Source Project
3c3683b552f592d8039a466c663f7de8c8286e975Chris Craik *
4c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * you may not use this file except in compliance with the License.
6c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * You may obtain a copy of the License at
7c3683b552f592d8039a466c663f7de8c8286e975Chris Craik *
8c3683b552f592d8039a466c663f7de8c8286e975Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9c3683b552f592d8039a466c663f7de8c8286e975Chris Craik *
10c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * Unless required by applicable law or agreed to in writing, software
11c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * See the License for the specific language governing permissions and
14c3683b552f592d8039a466c663f7de8c8286e975Chris Craik * limitations under the License.
15c3683b552f592d8039a466c663f7de8c8286e975Chris Craik */
16c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
17c3683b552f592d8039a466c663f7de8c8286e975Chris Craikpackage com.android.test.hwuicompare;
18c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
19c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport java.util.LinkedHashMap;
20c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport java.util.Map.Entry;
21c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
22c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.Canvas;
23c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.Paint;
24c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.graphics.RectF;
25c3683b552f592d8039a466c663f7de8c8286e975Chris Craikimport android.util.Log;
26c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
27c3683b552f592d8039a466c663f7de8c8286e975Chris Craikpublic abstract class DisplayModifier {
28c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
29c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    // automated tests ignore any combination of operations that don't together return TOTAL_MASK
30c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected final static int TOTAL_MASK = 0x1F;
31c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
32c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    // if we're filling, ensure we're not also sweeping over stroke parameters
33c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected final static int SWEEP_STROKE_WIDTH_BIT = 0x1 << 0;
34c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected final static int SWEEP_STROKE_CAP_BIT = 0x1 << 1;
35c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected final static int SWEEP_STROKE_JOIN_BIT = 0x1 << 2;
36c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
37c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected final static int SWEEP_SHADER_BIT = 0x1 << 3; // only allow non-simple shaders to use rectangle drawing
38c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected final static int SWEEP_TRANSFORM_BIT = 0x1 << 4; // only sweep over specified transforms
39c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
40c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    abstract public void modifyDrawing(Paint paint, Canvas canvas);
41c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    protected int mask() { return 0x0; };
42c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
43c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static final RectF gRect = new RectF(0, 0, 200, 175);
44c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static final float[] gPts = new float[] {
45c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            0, 100, 100, 0, 100, 200, 200, 100
46c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    };
47c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
4862a42c13a6e86255a0118688a60c9248030c95a9Chris Craik    private static final int NUM_PARALLEL_LINES = 24;
4962a42c13a6e86255a0118688a60c9248030c95a9Chris Craik    private static final float[] gTriPts = new float[] {
5062a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        75, 0, 130, 130, 130, 130, 0, 130, 0, 130, 75, 0
5162a42c13a6e86255a0118688a60c9248030c95a9Chris Craik    };
5262a42c13a6e86255a0118688a60c9248030c95a9Chris Craik    private static final float[] gLinePts = new float[NUM_PARALLEL_LINES * 8 + gTriPts.length];
5362a42c13a6e86255a0118688a60c9248030c95a9Chris Craik    static {
5462a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        int index;
5562a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        for (index = 0; index < gTriPts.length; index++) {
5662a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index] = gTriPts[index];
5762a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        }
5862a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        float val = 0;
5962a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        for (int i = 0; i < NUM_PARALLEL_LINES; i++) {
6062a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 0] = 150;
6162a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 1] = val;
6262a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 2] = 300;
6362a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 3] = val;
6462a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            index += 4;
6562a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            val += 8 + (2.0f/NUM_PARALLEL_LINES);
6662a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        }
6762a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        val = 0;
6862a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        for (int i = 0; i < NUM_PARALLEL_LINES; i++) {
6962a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 0] = val;
7062a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 1] = 150;
7162a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 2] = val;
7262a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            gLinePts[index + 3] = 300;
7362a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            index += 4;
7462a42c13a6e86255a0118688a60c9248030c95a9Chris Craik            val += 8 + (2.0f/NUM_PARALLEL_LINES);
7562a42c13a6e86255a0118688a60c9248030c95a9Chris Craik        }
7662a42c13a6e86255a0118688a60c9248030c95a9Chris Craik    };
7762a42c13a6e86255a0118688a60c9248030c95a9Chris Craik
78c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    @SuppressWarnings("serial")
79c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static final LinkedHashMap<String, LinkedHashMap<String, DisplayModifier>> gMaps = new LinkedHashMap<String, LinkedHashMap<String, DisplayModifier>>() {
80c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        {
81c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("aa", new LinkedHashMap<String, DisplayModifier>() {
82c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
83c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("true", new DisplayModifier() {
84c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
85c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
86c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setAntiAlias(true);
87c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
88c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
89c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("false", new DisplayModifier() {
90c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
91c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
92c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setAntiAlias(false);
93c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
94c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
95c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
96c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
97c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("style", new LinkedHashMap<String, DisplayModifier>() {
98c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
99c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("fill", new DisplayModifier() {
100c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
101c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
102c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStyle(Paint.Style.FILL);
103c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
104c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
105c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("stroke", new DisplayModifier() {
106c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
107c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
108c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStyle(Paint.Style.STROKE);
109c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
110c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
111c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_WIDTH_BIT; }
112c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
113c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("fillAndStroke", new DisplayModifier() {
114c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
115c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
116c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStyle(Paint.Style.FILL_AND_STROKE);
117c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
118c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
119c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
120c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_WIDTH_BIT; }
121c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
122c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
123c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
124c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("strokeWidth", new LinkedHashMap<String, DisplayModifier>() {
125c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
126c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("hair", new DisplayModifier() {
127c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
128c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
129c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeWidth(0);
130c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
131c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
132c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_WIDTH_BIT; }
133c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
134c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("0.3", new DisplayModifier() {
135c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
136c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
137c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeWidth(0.3f);
138c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
139c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
140c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("1", new DisplayModifier() {
141c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
142c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
143c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeWidth(1);
144c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
145c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
146c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("5", new DisplayModifier() {
147c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
148c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
149c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeWidth(5);
150c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
151c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
15265cd612face362d054a85d0f7e5881c59cd523beChris Craik                    put("30", new DisplayModifier() {
15365cd612face362d054a85d0f7e5881c59cd523beChris Craik                        @Override
15465cd612face362d054a85d0f7e5881c59cd523beChris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
15565cd612face362d054a85d0f7e5881c59cd523beChris Craik                            paint.setStrokeWidth(30);
15665cd612face362d054a85d0f7e5881c59cd523beChris Craik                        }
15765cd612face362d054a85d0f7e5881c59cd523beChris Craik                    });
158c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
159c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
160c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("strokeCap", new LinkedHashMap<String, DisplayModifier>() {
161c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
162c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("butt", new DisplayModifier() {
163c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
164c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
165c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeCap(Paint.Cap.BUTT);
166c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
167c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
168c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_CAP_BIT; }
169c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
170c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("round", new DisplayModifier() {
171c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
172c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
173c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeCap(Paint.Cap.ROUND);
174c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
175c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
176c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("square", new DisplayModifier() {
177c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
178c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
179c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeCap(Paint.Cap.SQUARE);
180c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
181c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
182c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
183c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
184c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("strokeJoin", new LinkedHashMap<String, DisplayModifier>() {
185c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
186c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("bevel", new DisplayModifier() {
187c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
188c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
189c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeJoin(Paint.Join.BEVEL);
190c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
191c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
192c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_JOIN_BIT; }
193c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
194c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("round", new DisplayModifier() {
195c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
196c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
197c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeJoin(Paint.Join.ROUND);
198c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
199c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
200c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("miter", new DisplayModifier() {
201c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
202c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
203c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setStrokeJoin(Paint.Join.MITER);
204c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
205c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
206c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    // TODO: add miter0, miter1 etc to test miter distances
207c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
208c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
209c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
210c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("transform", new LinkedHashMap<String, DisplayModifier>() {
211c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
212c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("noTransform", new DisplayModifier() {
213c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
214c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {}
215c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
216c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_TRANSFORM_BIT; };
217c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
218c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("rotate5", new DisplayModifier() {
219c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
220c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
221c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.rotate(5);
222c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
223c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
224c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("rotate45", new DisplayModifier() {
225c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
226c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
227c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.rotate(5);
228c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
229c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
230c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("rotate90", new DisplayModifier() {
231c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
232c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
233c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.rotate(90);
234c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.translate(0, -200);
235c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
236c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
237c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("scale2x2", new DisplayModifier() {
238c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
239c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
240c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.scale(2, 2);
241c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
242c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
243c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_TRANSFORM_BIT; };
244c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
245c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("rot20scl1x4", new DisplayModifier() {
246c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
247c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
248c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.rotate(20);
249c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.scale(1, 4);
250c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
251c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
252c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_TRANSFORM_BIT; };
253c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
254c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
255c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
256c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
257c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("shader", new LinkedHashMap<String, DisplayModifier>() {
258c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
259c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("noShader", new DisplayModifier() {
260c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
261c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {}
262c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
263c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_SHADER_BIT; };
264c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
265c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("repeatShader", new DisplayModifier() {
266c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
267c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
268c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShader(ResourceModifiers.instance().mRepeatShader);
269c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
270c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
271c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_SHADER_BIT; };
272c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
273c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("translatedShader", new DisplayModifier() {
274c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
275c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
276c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShader(ResourceModifiers.instance().mTranslatedShader);
277c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
278c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
279c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("scaledShader", new DisplayModifier() {
280c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
281c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
282c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShader(ResourceModifiers.instance().mScaledShader);
283c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
284c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
285c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("horGradient", new DisplayModifier() {
286c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
287c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
288c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShader(ResourceModifiers.instance().mHorGradient);
289c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
290c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
291c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("diagGradient", new DisplayModifier() {
292c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
293c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
294c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShader(ResourceModifiers.instance().mDiagGradient);
295c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
296c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
297c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_SHADER_BIT; };
298c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
299c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("vertGradient", new DisplayModifier() {
300c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
301c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
302c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShader(ResourceModifiers.instance().mVertGradient);
303c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
304c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
305c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
306c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
307c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
308c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            // FINAL MAP: DOES ACTUAL DRAWING
309c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            put("drawing", new LinkedHashMap<String, DisplayModifier>() {
310c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                {
311c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("roundRect", new DisplayModifier() {
312c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
313c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
314c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawRoundRect(gRect, 20, 20, paint);
315c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
316c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
317c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("rect", new DisplayModifier() {
318c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
319c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
320c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawRect(gRect, paint);
321c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
322c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
323c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_SHADER_BIT | SWEEP_STROKE_CAP_BIT; };
324c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
325c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("circle", new DisplayModifier() {
326c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
327c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
328c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawCircle(100, 100, 75, paint);
329c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
330c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
331c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("oval", new DisplayModifier() {
332c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
333c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
334c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawOval(gRect, paint);
335c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
336c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
33762a42c13a6e86255a0118688a60c9248030c95a9Chris Craik                    put("lines", new DisplayModifier() {
338c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
339c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
340c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawLines(gLinePts, paint);
341c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
342c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
343c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_CAP_BIT; };
344c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
345c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("plusPoints", new DisplayModifier() {
346c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
347c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
348c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawPoints(gPts, paint);
349c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
350c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
351c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("text", new DisplayModifier() {
352c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
353c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
354c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setTextSize(36);
355c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawText("TEXTTEST", 0, 50, paint);
356c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
357c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
358c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("shadowtext", new DisplayModifier() {
359c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
360c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
361c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setTextSize(36);
362c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            paint.setShadowLayer(3.0f, 0.0f, 3.0f, 0xffff00ff);
363c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawText("TEXTTEST", 0, 50, paint);
364c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
365c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
366c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("bitmapMesh", new DisplayModifier() {
367c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
368c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
369c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawBitmapMesh(ResourceModifiers.instance().mBitmap, 3, 3,
370c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                                    ResourceModifiers.instance().mBitmapVertices, 0, null, 0, null);
371c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
372c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
373c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("arc", new DisplayModifier() {
374c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
375c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
376c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawArc(gRect, 260, 285, false, paint);
377c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
378c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
379c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_CAP_BIT; };
380c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
381c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    put("arcFromCenter", new DisplayModifier() {
382c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
383c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        public void modifyDrawing(Paint paint, Canvas canvas) {
384c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                            canvas.drawArc(gRect, 260, 285, true, paint);
385c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        }
386c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        @Override
387c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                        protected int mask() { return SWEEP_STROKE_JOIN_BIT; };
388c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    });
389c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
390c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            });
391c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            // WARNING: DON'T PUT MORE MAPS BELOW THIS
392c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
393c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    };
394c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
395c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static LinkedHashMap<String, DisplayModifier> getMapAtIndex(int index) {
396c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        for (LinkedHashMap<String, DisplayModifier> map : gMaps.values()) {
397c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            if (index == 0) {
398c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                return map;
399c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
400c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            index--;
401c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
402c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return null;
403c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
404c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
405c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    // indices instead of iterators for easier bidirectional traversal
406c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static final int mIndices[] = new int[gMaps.size()];
407c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static final String[] mLastAppliedModifications = new String[gMaps.size()];
408c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
409c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static boolean stepInternal(boolean forward) {
410c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int modifierMapIndex = gMaps.size() - 1;
411c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        while (modifierMapIndex >= 0) {
412c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            LinkedHashMap<String, DisplayModifier> map = getMapAtIndex(modifierMapIndex);
413c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            mIndices[modifierMapIndex] += (forward ? 1 : -1);
414c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
415c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            if (mIndices[modifierMapIndex] >= 0 && mIndices[modifierMapIndex] < map.size()) {
416c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                break;
417c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
418c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
419c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            mIndices[modifierMapIndex] = (forward ? 0 : map.size() - 1);
420c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            modifierMapIndex--;
421c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
422c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return modifierMapIndex < 0; // true if resetting
423c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
424c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
425c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static boolean step() {
426c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        boolean ret = false;
427c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        do {
428c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            ret |= stepInternal(true);
429c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        } while (!checkModificationStateMask());
430c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return ret;
431c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
432c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
433c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static boolean stepBack() {
434c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        boolean ret = false;
435c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        do {
436c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            ret |= stepInternal(false);
437c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        } while (!checkModificationStateMask());
438c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return ret;
439c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
440c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
441c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    private static boolean checkModificationStateMask() {
442c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int operatorMask = 0x0;
443c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int mapIndex = 0;
444c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        for (LinkedHashMap<String, DisplayModifier> map : gMaps.values()) {
445c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            int displayModifierIndex = mIndices[mapIndex];
446c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            for (Entry<String, DisplayModifier> modifierEntry : map.entrySet()) {
447c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                if (displayModifierIndex == 0) {
448c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    mLastAppliedModifications[mapIndex] = modifierEntry.getKey();
449c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    operatorMask |= modifierEntry.getValue().mask();
450c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    break;
451c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
452c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                displayModifierIndex--;
453c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
454c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            mapIndex++;
455c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
456c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return operatorMask == TOTAL_MASK;
457c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
458c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
459c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static void apply(Paint paint, Canvas canvas) {
460c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int mapIndex = 0;
461c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        for (LinkedHashMap<String, DisplayModifier> map : gMaps.values()) {
462c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            int displayModifierIndex = mIndices[mapIndex];
463c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            for (Entry<String, DisplayModifier> modifierEntry : map.entrySet()) {
464c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                if (displayModifierIndex == 0) {
465c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    mLastAppliedModifications[mapIndex] = modifierEntry.getKey();
466c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    modifierEntry.getValue().modifyDrawing(paint, canvas);
467c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                    break;
468c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                }
469c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                displayModifierIndex--;
470c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
471c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            mapIndex++;
472c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
473c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
474c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
475c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static String[] getLastAppliedModifications() {
476c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return mLastAppliedModifications.clone();
477c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
478c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
479c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static String[][] getStrings() {
480c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        String[][] keys = new String[gMaps.size()][];
481c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
482c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        int i = 0;
483c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        for (LinkedHashMap<String, DisplayModifier> map : gMaps.values()) {
484c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            keys[i] = new String[map.size()];
485c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            int j = 0;
486c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            for (String key : map.keySet()) {
487c3683b552f592d8039a466c663f7de8c8286e975Chris Craik                keys[i][j++] = key;
488c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            }
489c3683b552f592d8039a466c663f7de8c8286e975Chris Craik            i++;
490c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        }
491c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
492c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return keys;
493c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
494c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
495c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static void setIndex(int mapIndex, int newIndexValue) {
496c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        mIndices[mapIndex] = newIndexValue;
497c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
498c3683b552f592d8039a466c663f7de8c8286e975Chris Craik
499c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    public static int[] getIndices() {
500c3683b552f592d8039a466c663f7de8c8286e975Chris Craik        return mIndices;
501c3683b552f592d8039a466c663f7de8c8286e975Chris Craik    }
502c3683b552f592d8039a466c663f7de8c8286e975Chris Craik}
503