Home | History | Annotate | Download | only in bitmapverifiers
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.uirendering.cts.bitmapverifiers;
     18 
     19 import static org.junit.Assert.assertFalse;
     20 
     21 import android.graphics.Rect;
     22 import android.graphics.Region;
     23 import android.graphics.RegionIterator;
     24 
     25 import java.util.ArrayList;
     26 import java.util.List;
     27 
     28 public class RegionVerifier extends BitmapVerifier {
     29     private static class SubRegionVerifiers {
     30         public Region region;
     31         public BitmapVerifier verifier;
     32 
     33         SubRegionVerifiers(Region region, BitmapVerifier verifier) {
     34             this.region = region;
     35             this.verifier = verifier;
     36         }
     37     }
     38 
     39     private List<SubRegionVerifiers> mRegionVerifiers = new ArrayList<>();
     40 
     41     @Override
     42     public boolean verify(int[] bitmap, int offset, int stride, int width, int height) {
     43         assertFalse(mRegionVerifiers.isEmpty());
     44         boolean isVerified = true;
     45         for (SubRegionVerifiers subRegionVerifier : mRegionVerifiers) {
     46             if (subRegionVerifier.region.isRect()) {
     47                 Rect area = subRegionVerifier.region.getBounds();
     48                 isVerified &= verifySubRect(bitmap, offset, stride, width, height,
     49                         subRegionVerifier.verifier, area);
     50             } else {
     51                 RegionIterator iter = new RegionIterator(subRegionVerifier.region);
     52                 Rect area = new Rect();
     53                 while (iter.next(area)) {
     54                     isVerified &= verifySubRect(bitmap, offset, stride, width, height,
     55                             subRegionVerifier.verifier, area);
     56                 }
     57             }
     58         }
     59         return isVerified;
     60     }
     61 
     62     private boolean verifySubRect(int[] bitmap, int offset, int stride, int width, int height,
     63             BitmapVerifier subVerifier, Rect rect) {
     64         final int newOffset = rect.top * stride + rect.left + offset;
     65         return subVerifier.verify(bitmap, newOffset, stride, rect.width(), rect.height());
     66     }
     67 
     68     public RegionVerifier addVerifier(Rect area, BitmapVerifier verifier) {
     69         return addVerifier(new Region(area), verifier);
     70     }
     71 
     72     public RegionVerifier addVerifier(Region area, BitmapVerifier verifier) {
     73         mRegionVerifiers.add(new SubRegionVerifiers(area, verifier));
     74         return this;
     75     }
     76 }
     77