124519371cb541db6f59d903d21878ed9c45eb549scroggo/* 224519371cb541db6f59d903d21878ed9c45eb549scroggo * Copyright 2014 Google Inc. 324519371cb541db6f59d903d21878ed9c45eb549scroggo * 424519371cb541db6f59d903d21878ed9c45eb549scroggo * Use of this source code is governed by a BSD-style license that can be 524519371cb541db6f59d903d21878ed9c45eb549scroggo * found in the LICENSE file. 624519371cb541db6f59d903d21878ed9c45eb549scroggo */ 724519371cb541db6f59d903d21878ed9c45eb549scroggo 824519371cb541db6f59d903d21878ed9c45eb549scroggo#include "CanvasStateHelpers.h" 924519371cb541db6f59d903d21878ed9c45eb549scroggo#ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 1024519371cb541db6f59d903d21878ed9c45eb549scroggo#include "SkCanvas.h" 1124519371cb541db6f59d903d21878ed9c45eb549scroggo#include "SkCanvasStateUtils.h" 1224519371cb541db6f59d903d21878ed9c45eb549scroggo#include "SkPaint.h" 1324519371cb541db6f59d903d21878ed9c45eb549scroggo#include "SkRect.h" 1424519371cb541db6f59d903d21878ed9c45eb549scroggo#include "SkRegion.h" 1524519371cb541db6f59d903d21878ed9c45eb549scroggo 1624519371cb541db6f59d903d21878ed9c45eb549scroggovoid complex_layers_draw(SkCanvas* canvas, float left, float top, 1724519371cb541db6f59d903d21878ed9c45eb549scroggo float right, float bottom, int32_t spacer) { 1824519371cb541db6f59d903d21878ed9c45eb549scroggo SkPaint bluePaint; 1924519371cb541db6f59d903d21878ed9c45eb549scroggo bluePaint.setColor(SK_ColorBLUE); 2024519371cb541db6f59d903d21878ed9c45eb549scroggo bluePaint.setStyle(SkPaint::kFill_Style); 2124519371cb541db6f59d903d21878ed9c45eb549scroggo 2224519371cb541db6f59d903d21878ed9c45eb549scroggo SkRect rect = SkRect::MakeLTRB(left, top, right, bottom); 2324519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->drawRect(rect, bluePaint); 2424519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->translate(0, rect.height() + spacer); 2524519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->drawRect(rect, bluePaint); 2624519371cb541db6f59d903d21878ed9c45eb549scroggo} 2724519371cb541db6f59d903d21878ed9c45eb549scroggo 2824519371cb541db6f59d903d21878ed9c45eb549scroggoextern "C" bool complex_layers_draw_from_canvas_state(SkCanvasState* state, 2924519371cb541db6f59d903d21878ed9c45eb549scroggo float left, float top, float right, float bottom, int32_t spacer) { 3024519371cb541db6f59d903d21878ed9c45eb549scroggo SkCanvas* canvas = SkCanvasStateUtils::CreateFromCanvasState(state); 3124519371cb541db6f59d903d21878ed9c45eb549scroggo if (!canvas) { 3224519371cb541db6f59d903d21878ed9c45eb549scroggo return false; 3324519371cb541db6f59d903d21878ed9c45eb549scroggo } 3424519371cb541db6f59d903d21878ed9c45eb549scroggo complex_layers_draw(canvas, left, top, right, bottom, spacer); 3524519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->unref(); 3624519371cb541db6f59d903d21878ed9c45eb549scroggo return true; 3724519371cb541db6f59d903d21878ed9c45eb549scroggo} 3824519371cb541db6f59d903d21878ed9c45eb549scroggo 3924519371cb541db6f59d903d21878ed9c45eb549scroggovoid complex_clips_draw(SkCanvas* canvas, int32_t left, int32_t top, 4024519371cb541db6f59d903d21878ed9c45eb549scroggo int32_t right, int32_t bottom, int32_t clipOp, const SkRegion& localRegion) { 4124519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->save(); 4224519371cb541db6f59d903d21878ed9c45eb549scroggo SkRect clipRect = SkRect::MakeLTRB(SkIntToScalar(left), SkIntToScalar(top), 4324519371cb541db6f59d903d21878ed9c45eb549scroggo SkIntToScalar(right), SkIntToScalar(bottom)); 4424519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->clipRect(clipRect, (SkRegion::Op) clipOp); 4524519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->drawColor(SK_ColorBLUE); 4624519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->restore(); 4724519371cb541db6f59d903d21878ed9c45eb549scroggo 4824519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->clipRegion(localRegion, (SkRegion::Op) clipOp); 4924519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->drawColor(SK_ColorBLUE); 5024519371cb541db6f59d903d21878ed9c45eb549scroggo} 5124519371cb541db6f59d903d21878ed9c45eb549scroggo 5224519371cb541db6f59d903d21878ed9c45eb549scroggoextern "C" bool complex_clips_draw_from_canvas_state(SkCanvasState* state, 5324519371cb541db6f59d903d21878ed9c45eb549scroggo int32_t left, int32_t top, int32_t right, int32_t bottom, int32_t clipOp, 5424519371cb541db6f59d903d21878ed9c45eb549scroggo int32_t regionRects, int32_t* rectCoords) { 5524519371cb541db6f59d903d21878ed9c45eb549scroggo SkCanvas* canvas = SkCanvasStateUtils::CreateFromCanvasState(state); 5624519371cb541db6f59d903d21878ed9c45eb549scroggo if (!canvas) { 5724519371cb541db6f59d903d21878ed9c45eb549scroggo return false; 5824519371cb541db6f59d903d21878ed9c45eb549scroggo } 5924519371cb541db6f59d903d21878ed9c45eb549scroggo 6024519371cb541db6f59d903d21878ed9c45eb549scroggo SkRegion localRegion; 6124519371cb541db6f59d903d21878ed9c45eb549scroggo for (int32_t i = 0; i < regionRects; ++i) { 6224519371cb541db6f59d903d21878ed9c45eb549scroggo localRegion.op(rectCoords[0], rectCoords[1], rectCoords[2], rectCoords[3], 6324519371cb541db6f59d903d21878ed9c45eb549scroggo SkRegion::kUnion_Op); 6424519371cb541db6f59d903d21878ed9c45eb549scroggo rectCoords += 4; 6524519371cb541db6f59d903d21878ed9c45eb549scroggo } 6624519371cb541db6f59d903d21878ed9c45eb549scroggo 6724519371cb541db6f59d903d21878ed9c45eb549scroggo complex_clips_draw(canvas, left, top, right, bottom, clipOp, localRegion); 6824519371cb541db6f59d903d21878ed9c45eb549scroggo canvas->unref(); 6924519371cb541db6f59d903d21878ed9c45eb549scroggo return true; 7024519371cb541db6f59d903d21878ed9c45eb549scroggo} 7124519371cb541db6f59d903d21878ed9c45eb549scroggo#endif // SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 72