blob: a2690ea42a531dc34ab7c3cc9d8d2097b44d8d3d [file] [log] [blame]
#include "EdgeWalker_Test.h"
#include "ShapeOps.h"
#include "SkApplication.h"
#include "SkCanvas.h"
#include "SkEvent.h"
#include "SkGraphics.h"
#include "SkPaint.h"
SkCanvas* canvas = 0;
SkBitmap* bitmap;
static bool test15(SkCanvas* canvas) {
// Three circles bounce inside a rectangle. The circles describe three, four
// or five points which in turn describe a polygon. The polygon points
// bounce inside the circles. The circles rotate and scale over time. The
// polygons are combined into a single path, simplified, and stroked.
static int step = 0;
const int circles = 3;
int scales[circles];
int angles[circles];
int locs[circles * 2];
int pts[circles * 2 * 4];
int c, p;
for (c = 0; c < circles; ++c) {
scales[c] = abs(10 - (step + c * 4) % 21);
angles[c] = (step + c * 6) % 600;
locs[c * 2] = abs(130 - (step + c * 9) % 261);
locs[c * 2 + 1] = abs(170 - (step + c * 11) % 341);
for (p = 0; p < 4; ++p) {
pts[c * 8 + p * 2] = abs(90 - ((step + c * 121 + p * 13) % 190));
pts[c * 8 + p * 2 + 1] = abs(110 - ((step + c * 223 + p * 17) % 230));
}
}
SkPath path, out;
for (c = 0; c < circles; ++c) {
for (p = 0; p < 4; ++p) {
SkScalar x = pts[c * 8 + p * 2];
SkScalar y = pts[c * 8 + p * 2 + 1];
x *= 3 + scales[c] / 10.0f;
y *= 3 + scales[c] / 10.0f;
SkScalar angle = angles[c] * 3.1415f * 2 / 600;
SkScalar temp = x * cos(angle) - y * sin(angle);
y = x * sin(angle) + y * cos(angle);
x = temp;
x += locs[c * 2] * 200 / 130.0f;
y += locs[c * 2 + 1] * 200 / 170.0f;
x += 50;
// y += 200;
if (p == 0) {
path.moveTo(x, y);
} else {
path.lineTo(x, y);
}
}
path.close();
}
showPath(path, "original:");
simplify(path, true, out);
showPath(out, "simplified:");
SkPaint paint;
paint.setAntiAlias(true);
paint.setStyle(SkPaint::kStroke_Style);
paint.setStrokeWidth(3);
paint.setColor(0x3F007fbF);
canvas->drawPath(path, paint);
paint.setColor(0xFF60FF00);
paint.setStrokeWidth(1);
canvas->drawPath(out, paint);
++step;
return true;
}
static bool (*tests[])(SkCanvas* ) = {
test15,
};
static size_t testsCount = sizeof(tests) / sizeof(tests[0]);
static bool (*firstTest)(SkCanvas*) = test15;
extern "C" void* getPixels(bool* animate);
extern "C" void unlockPixels();
extern "C" void* getPixels(bool* animate) {
if (!canvas) {
canvas = new SkCanvas();
bitmap = new SkBitmap();
SkBitmap::Config config = SkBitmap::kARGB_8888_Config;
bitmap->setConfig(config, 1100, 630);
bitmap->allocPixels();
bitmap->setIsOpaque(true);
canvas->setBitmapDevice(*bitmap);
}
canvas->drawColor(SK_ColorWHITE);
size_t index = 0;
if (index == 0 && firstTest) {
while (index < testsCount && tests[index] != firstTest) {
++index;
}
}
*animate = (tests[index])(canvas);
bitmap->lockPixels();
return bitmap->getPixels();
}
extern "C" void unlockPixels() {
bitmap->unlockPixels();
}