3021795041
Several things are accomplished as part of this: 1. The canvas_state_lib build target is brought back so that we can actually test the canvas state sharing across library boundaries. 2. The canvas state helper functions are updated to work with DLLs (confirmed tests pass on Windows in cross library mode) 3. The tests now always run, and the cross-state define only changes what version of the helper functions are used 4. Updated the dlopen code in the test to use the SkOSLibrary ports instead of calling dlopen/dlclose directly. 5. Fix bugs in SkCanvasStateUtils that were uncovered as part of always running these tests. 6. Switches the define away from SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG to SK_TEST_CANVAS_STATE_CROSS_LIBRARY, since these tests are not strictly speaking testing the unclipped layer feature. Change-Id: Id4ae41e4bc3fb8227367deac899878ecf9d7b98e Reviewed-on: https://skia-review.googlesource.com/c/skia/+/341003 Reviewed-by: Derek Sollenberger <djsollen@google.com> Commit-Queue: Michael Ludwig <michaelludwig@google.com>
80 lines
2.6 KiB
C++
80 lines
2.6 KiB
C++
/*
|
|
* Copyright 2014 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "include/core/SkTypes.h"
|
|
|
|
#if !defined(SK_TEST_CANVAS_STATE_CROSS_LIBRARY)
|
|
|
|
#include "tests/CanvasStateHelpers.h"
|
|
|
|
#include "include/core/SkCanvas.h"
|
|
#include "include/core/SkClipOp.h"
|
|
#include "include/core/SkColor.h"
|
|
#include "include/core/SkPaint.h"
|
|
#include "include/core/SkRect.h"
|
|
#include "include/core/SkRegion.h"
|
|
#include "include/core/SkScalar.h"
|
|
#include "include/utils/SkCanvasStateUtils.h"
|
|
|
|
#include <memory>
|
|
|
|
void complex_layers_draw(SkCanvas* canvas, float left, float top,
|
|
float right, float bottom, int32_t spacer) {
|
|
SkPaint bluePaint;
|
|
bluePaint.setColor(SK_ColorBLUE);
|
|
bluePaint.setStyle(SkPaint::kFill_Style);
|
|
|
|
SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
|
|
canvas->drawRect(rect, bluePaint);
|
|
canvas->translate(0, rect.height() + spacer);
|
|
canvas->drawRect(rect, bluePaint);
|
|
}
|
|
|
|
extern "C" bool complex_layers_draw_from_canvas_state(SkCanvasState* state,
|
|
float left, float top, float right, float bottom, int32_t spacer) {
|
|
std::unique_ptr<SkCanvas> canvas = SkCanvasStateUtils::MakeFromCanvasState(state);
|
|
if (!canvas) {
|
|
return false;
|
|
}
|
|
complex_layers_draw(canvas.get(), left, top, right, bottom, spacer);
|
|
return true;
|
|
}
|
|
|
|
void complex_clips_draw(SkCanvas* canvas, int32_t left, int32_t top,
|
|
int32_t right, int32_t bottom, int32_t clipOp, const SkRegion& localRegion) {
|
|
canvas->save();
|
|
SkRect clipRect = SkRect::MakeLTRB(SkIntToScalar(left), SkIntToScalar(top),
|
|
SkIntToScalar(right), SkIntToScalar(bottom));
|
|
canvas->clipRect(clipRect, (SkRegion::Op) clipOp);
|
|
canvas->drawColor(SK_ColorBLUE);
|
|
canvas->restore();
|
|
|
|
canvas->clipRegion(localRegion, (SkClipOp) clipOp);
|
|
canvas->drawColor(SK_ColorBLUE);
|
|
}
|
|
|
|
extern "C" bool complex_clips_draw_from_canvas_state(SkCanvasState* state,
|
|
int32_t left, int32_t top, int32_t right, int32_t bottom, int32_t clipOp,
|
|
int32_t regionRects, int32_t* rectCoords) {
|
|
std::unique_ptr<SkCanvas> canvas = SkCanvasStateUtils::MakeFromCanvasState(state);
|
|
if (!canvas) {
|
|
return false;
|
|
}
|
|
|
|
SkRegion localRegion;
|
|
for (int32_t i = 0; i < regionRects; ++i) {
|
|
localRegion.op({rectCoords[0], rectCoords[1], rectCoords[2], rectCoords[3]},
|
|
SkRegion::kUnion_Op);
|
|
rectCoords += 4;
|
|
}
|
|
|
|
complex_clips_draw(canvas.get(), left, top, right, bottom, clipOp, localRegion);
|
|
return true;
|
|
}
|
|
|
|
#endif // SK_TEST_CANVAS_STATE_CROSS_LIBRARY
|