private void onDraw0(Canvas canvas) {
    if (Constants.LOG_V) Log.v(TAG, "onDraw(" + canvas.getClipBounds() + ")");

    canvas.save();
    canvas.translate(offsetX, offsetY);
    canvas.clipRect(0, 0, size * cellWidth, size * cellHeight);

    Rect clipBounds = canvas.getClipBounds();

    if (theme.isDrawAreaColors(puzzle.getPuzzleType())) drawAreaColors(canvas, clipBounds);
    else drawBackground(canvas);

    drawExtraRegions(canvas, clipBounds);

    if (puzzle.isSolved()) drawCongrats(canvas);
    else if (paused) drawPaused(canvas);
    else {
      drawHighlightedCells(canvas, clipBounds);

      drawMarkedPosition(canvas);
    }

    if (!preview && puzzle.hasErrors()) drawErrors(canvas, clipBounds);

    drawValues(canvas, clipBounds);

    drawGrid(canvas);

    drawRegionBorders(canvas, clipBounds);

    canvas.restore();

    drawOuterBorder(canvas);
  }
 private void drawExtraRegions(Canvas canvas, int row, int col) {
   if (puzzle.isExtraRegion(row, col)) {
     canvas.drawRect(
         0,
         0,
         cellWidth,
         cellHeight,
         theme.getExtraRegionPaint(puzzle.getPuzzleType(), puzzle.getExtraRegionCode(row, col)));
   }
 }