@Override
  public DirtyRegionContainer getDirtyRegions(Effect defaultInput, DirtyRegionPool regionPool) {
    Effect di = getDefaultedInput(0, defaultInput);
    DirtyRegionContainer drc = di.getDirtyRegions(defaultInput, regionPool);

    drc.grow(state.getHPad(), state.getVPad());

    return drc;
  }
  @Test
  public void dropShadowTest() {
    setupTest();

    effect = new DropShadow();

    drc.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    g1bn.setEffect(effect);
    g1bn.applyEffect(g1bn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(40, 40, 70, 70)});
    compareResult(drcExpected, drc);

    drc.addDirtyRegion(new RectBounds(70, 70, 80, 80));
    gbn.setEffect(effect);
    gbn.applyEffect(gbn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(30, 30, 90, 90)});
    compareResult(drcExpected, drc);
  }
  @Test
  public void colorAdjustTest() {
    setupTest();

    effect = new ColorAdjust();

    drc.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    g1bn.setEffect(effect);
    g1bn.applyEffect(g1bn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    compareResult(drcExpected, drc);

    drc.addDirtyRegion(new RectBounds(70, 70, 80, 80));
    gbn.setEffect(effect);
    gbn.applyEffect(gbn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(
        new RectBounds[] {new RectBounds(50, 50, 60, 60), new RectBounds(70, 70, 80, 80)});
    compareResult(drcExpected, drc);
  }
  @Test
  public void boxBlurTest() {
    setupTest();

    effect = new BoxBlur(10, 5, 3);

    drc.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    g1bn.setEffect(effect);
    g1bn.applyEffect(g1bn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(36, 44, 74, 66)});
    compareResult(drcExpected, drc);

    drc.addDirtyRegion(new RectBounds(70, 70, 80, 80));
    gbn.setEffect(effect);
    gbn.applyEffect(gbn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(
        new RectBounds[] {new RectBounds(22, 38, 88, 72), new RectBounds(56, 64, 94, 86)});
    compareResult(drcExpected, drc);
  }
  @Test
  public void motionBlurTest() {
    setupTest();

    effect = new MotionBlur();

    drc.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    g1bn.setEffect(effect);
    g1bn.applyEffect(g1bn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(40, 50, 70, 60)});
    compareResult(drcExpected, drc);

    ((MotionBlur) effect).setAngle((float) Math.toRadians(90));
    drc.addDirtyRegion(new RectBounds(70, 70, 80, 80));
    gbn.setEffect(effect);
    gbn.applyEffect(gbn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(
        new RectBounds[] {new RectBounds(39, 40, 71, 70), new RectBounds(69, 60, 81, 90)});
    compareResult(drcExpected, drc);
  }
  @Test
  public void gausianBlurTest() {
    setupTest();

    effect = new GaussianBlur(5);

    drc.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    g1bn.setEffect(effect);
    g1bn.applyEffect(g1bn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(45, 45, 65, 65)});
    compareResult(drcExpected, drc);

    ((GaussianBlur) effect).setRadius(2);
    drc.addDirtyRegion(new RectBounds(70, 70, 80, 80));
    gbn.setEffect(effect);
    gbn.applyEffect(gbn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(
        new RectBounds[] {new RectBounds(43, 43, 67, 67), new RectBounds(68, 68, 82, 82)});
    compareResult(drcExpected, drc);
  }
  @Test
  public void boxShadowTest() {
    setupTest();

    effect = new BoxShadow();
    ((BoxShadow) effect).setHorizontalSize(10);

    drc.deriveWithNewRegions(new RectBounds[] {new RectBounds(50, 50, 60, 60)});
    g1bn.setEffect(effect);
    g1bn.applyEffect(g1bn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(new RectBounds[] {new RectBounds(45, 50, 65, 60)});
    compareResult(drcExpected, drc);

    ((BoxShadow) effect).setHorizontalSize(0);
    ((BoxShadow) effect).setVerticalSize(10);
    drc.addDirtyRegion(new RectBounds(70, 70, 80, 80));
    gbn.setEffect(effect);
    gbn.applyEffect(gbn.getEffectFilter(), drc, drp);
    drcExpected.deriveWithNewRegions(
        new RectBounds[] {new RectBounds(45, 45, 65, 65), new RectBounds(70, 65, 80, 85)});
    compareResult(drcExpected, drc);
  }
 private void compareResult(DirtyRegionContainer expected, DirtyRegionContainer computed) {
   for (int i = 0; i < computed.size(); i++) {
     Assert.assertEquals(expected.getDirtyRegion(i), computed.getDirtyRegion(i));
   }
 }