mirror of https://github.com/mgba-emu/mgba.git
Util: Shape drawing fixes, better tests
This commit is contained in:
parent
fe229348eb
commit
0457b1bcb7
|
@ -705,6 +705,9 @@ static void _drawCircle2x2(struct mPainter* painter, int x, int y, uint32_t colo
|
||||||
}
|
}
|
||||||
|
|
||||||
void mPainterDrawCircle(struct mPainter* painter, int x, int y, int diameter) {
|
void mPainterDrawCircle(struct mPainter* painter, int x, int y, int diameter) {
|
||||||
|
if (diameter < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
int radius = diameter / 2;
|
int radius = diameter / 2;
|
||||||
int offset = (diameter ^ 1) & 1;
|
int offset = (diameter ^ 1) & 1;
|
||||||
int stroke = painter->strokeWidth;
|
int stroke = painter->strokeWidth;
|
||||||
|
@ -740,7 +743,7 @@ void mPainterDrawCircle(struct mPainter* painter, int x, int y, int diameter) {
|
||||||
mPainterDrawPixel(painter, x + i, y + radius, painter->strokeColor);
|
mPainterDrawPixel(painter, x + i, y + radius, painter->strokeColor);
|
||||||
}
|
}
|
||||||
if (painter->fill) {
|
if (painter->fill) {
|
||||||
for (i = i; i < y1 + 1; ++i) {
|
for (i = 1; i < y1 + 1; ++i) {
|
||||||
mPainterDrawPixel(painter, x + radius, y + radius - i, painter->fillColor);
|
mPainterDrawPixel(painter, x + radius, y + radius - i, painter->fillColor);
|
||||||
mPainterDrawPixel(painter, x + radius, y + radius + i, painter->fillColor);
|
mPainterDrawPixel(painter, x + radius, y + radius + i, painter->fillColor);
|
||||||
mPainterDrawPixel(painter, x + radius - i, y + radius, painter->fillColor);
|
mPainterDrawPixel(painter, x + radius - i, y + radius, painter->fillColor);
|
||||||
|
|
|
@ -1300,6 +1300,24 @@ M_TEST_DEFINE(painterFillRectangleBlend) {
|
||||||
mImageDestroy(image);
|
mImageDestroy(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
M_TEST_DEFINE(painterFillRectangleInvalid) {
|
||||||
|
struct mImage* image;
|
||||||
|
struct mPainter painter;
|
||||||
|
|
||||||
|
image = mImageCreate(4, 4, mCOLOR_XRGB8);
|
||||||
|
mPainterInit(&painter, image);
|
||||||
|
painter.blend = false;
|
||||||
|
painter.fill = true;
|
||||||
|
painter.strokeWidth = 0;
|
||||||
|
painter.fillColor = 0xFF0000FF;
|
||||||
|
mPainterDrawRectangle(&painter, 1, 1, -1, -1);
|
||||||
|
COMPARE4X(0x000000, 0x000000, 0x000000, 0x000000,
|
||||||
|
0x000000, 0x000000, 0x000000, 0x000000,
|
||||||
|
0x000000, 0x000000, 0x000000, 0x000000,
|
||||||
|
0x000000, 0x000000, 0x000000, 0x000000);
|
||||||
|
mImageDestroy(image);
|
||||||
|
}
|
||||||
|
|
||||||
M_TEST_DEFINE(painterStrokeRectangle) {
|
M_TEST_DEFINE(painterStrokeRectangle) {
|
||||||
struct mImage* image;
|
struct mImage* image;
|
||||||
struct mPainter painter;
|
struct mPainter painter;
|
||||||
|
@ -1565,6 +1583,25 @@ M_TEST_DEFINE(painterStrokeRectangleBlend) {
|
||||||
0x400000FF, 0x40FF0000, 0x6F91006D, 0x40FF0000,
|
0x400000FF, 0x40FF0000, 0x6F91006D, 0x40FF0000,
|
||||||
0x400000FF, 0x6F91006D, 0x400000FF, 0x40FF0000,
|
0x400000FF, 0x6F91006D, 0x400000FF, 0x40FF0000,
|
||||||
0x00000000, 0x40FF0000, 0x40FF0000, 0x40FF0000);
|
0x00000000, 0x40FF0000, 0x40FF0000, 0x40FF0000);
|
||||||
|
mImageDestroy(image);
|
||||||
|
}
|
||||||
|
|
||||||
|
M_TEST_DEFINE(painterStrokeRectangleInvalid) {
|
||||||
|
struct mImage* image;
|
||||||
|
struct mPainter painter;
|
||||||
|
|
||||||
|
image = mImageCreate(4, 4, mCOLOR_XRGB8);
|
||||||
|
mPainterInit(&painter, image);
|
||||||
|
painter.blend = false;
|
||||||
|
painter.fill = false;
|
||||||
|
painter.strokeWidth = 1;
|
||||||
|
painter.strokeColor = 0xFF0000FF;
|
||||||
|
mPainterDrawRectangle(&painter, 1, 1, -1, -1);
|
||||||
|
COMPARE4X(0x000000, 0x000000, 0x000000, 0x000000,
|
||||||
|
0x000000, 0x000000, 0x000000, 0x000000,
|
||||||
|
0x000000, 0x000000, 0x000000, 0x000000,
|
||||||
|
0x000000, 0x000000, 0x000000, 0x000000);
|
||||||
|
mImageDestroy(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
M_TEST_DEFINE(painterDrawRectangle) {
|
M_TEST_DEFINE(painterDrawRectangle) {
|
||||||
|
@ -1876,6 +1913,7 @@ M_TEST_DEFINE(painterDrawCircleArea) {
|
||||||
}
|
}
|
||||||
float area = i * i;
|
float area = i * i;
|
||||||
assert_float_equal(filled / area, M_PI / 4, 0.12);
|
assert_float_equal(filled / area, M_PI / 4, 0.12);
|
||||||
|
mImageDestroy(image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1905,10 +1943,10 @@ M_TEST_DEFINE(painterDrawCircleCircumference) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert_float_equal(filled / (float) i, M_PI, M_PI * 0.11);
|
assert_float_equal(filled / (float) i, M_PI, M_PI * 0.11);
|
||||||
|
mImageDestroy(image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
M_TEST_DEFINE(painterDrawCircleOffset) {
|
M_TEST_DEFINE(painterDrawCircleOffset) {
|
||||||
struct mImage* image;
|
struct mImage* image;
|
||||||
struct mPainter painter;
|
struct mPainter painter;
|
||||||
|
@ -1935,9 +1973,71 @@ M_TEST_DEFINE(painterDrawCircleOffset) {
|
||||||
assert_int_equal(color, mImageGetPixel(image, x + i, y + i));
|
assert_int_equal(color, mImageGetPixel(image, x + i, y + i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mImageDestroy(image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
M_TEST_DEFINE(painterDrawCircleBlend) {
|
||||||
|
struct mImage* image;
|
||||||
|
struct mPainter painter;
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
for (i = 1; i < 10; ++i) {
|
||||||
|
for (j = 0; j < i / 2 + 1; ++j) {
|
||||||
|
image = mImageCreate(i, i, mCOLOR_ARGB8);
|
||||||
|
mPainterInit(&painter, image);
|
||||||
|
painter.blend = true;
|
||||||
|
painter.fill = true;
|
||||||
|
painter.strokeWidth = j;
|
||||||
|
painter.fillColor = 0x8000FF00;
|
||||||
|
painter.strokeColor = 0x800000FF;
|
||||||
|
mPainterDrawCircle(&painter, 0, 0, i);
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
for (y = 0; y < i; ++y) {
|
||||||
|
for (x = 0; x < i; ++x) {
|
||||||
|
uint32_t color = mImageGetPixel(image, x, y);
|
||||||
|
if (color != painter.strokeColor && color != painter.fillColor) {
|
||||||
|
assert_int_equal(color, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mImageDestroy(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
M_TEST_DEFINE(painterDrawCircleInvalid) {
|
||||||
|
struct mImage* image;
|
||||||
|
struct mPainter painter;
|
||||||
|
|
||||||
|
image = mImageCreate(4, 4, mCOLOR_XRGB8);
|
||||||
|
mPainterInit(&painter, image);
|
||||||
|
painter.blend = false;
|
||||||
|
painter.fill = true;
|
||||||
|
painter.strokeWidth = 0;
|
||||||
|
painter.fillColor = 0xFF0000FF;
|
||||||
|
mPainterDrawCircle(&painter, 2, 2, -1);
|
||||||
|
COMPARE4X(0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00);
|
||||||
|
mImageDestroy(image);
|
||||||
|
|
||||||
|
image = mImageCreate(4, 4, mCOLOR_XRGB8);
|
||||||
|
mPainterInit(&painter, image);
|
||||||
|
painter.blend = false;
|
||||||
|
painter.fill = false;
|
||||||
|
painter.strokeWidth = 1;
|
||||||
|
painter.strokeColor = 0xFF0000FF;
|
||||||
|
mPainterDrawCircle(&painter, 2, 2, -1);
|
||||||
|
COMPARE4X(0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00);
|
||||||
|
mImageDestroy(image);
|
||||||
|
}
|
||||||
|
|
||||||
#undef COMPARE3X
|
#undef COMPARE3X
|
||||||
#undef COMPARE3
|
#undef COMPARE3
|
||||||
#undef COMPARE4X
|
#undef COMPARE4X
|
||||||
|
@ -1969,9 +2069,11 @@ M_TEST_SUITE_DEFINE(Image,
|
||||||
cmocka_unit_test(blitBoundaries),
|
cmocka_unit_test(blitBoundaries),
|
||||||
cmocka_unit_test(painterFillRectangle),
|
cmocka_unit_test(painterFillRectangle),
|
||||||
cmocka_unit_test(painterFillRectangleBlend),
|
cmocka_unit_test(painterFillRectangleBlend),
|
||||||
|
cmocka_unit_test(painterFillRectangleInvalid),
|
||||||
cmocka_unit_test(painterStrokeRectangle),
|
cmocka_unit_test(painterStrokeRectangle),
|
||||||
cmocka_unit_test(painterStrokeRectangleWidth),
|
cmocka_unit_test(painterStrokeRectangleWidth),
|
||||||
cmocka_unit_test(painterStrokeRectangleBlend),
|
cmocka_unit_test(painterStrokeRectangleBlend),
|
||||||
|
cmocka_unit_test(painterStrokeRectangleInvalid),
|
||||||
cmocka_unit_test(painterDrawRectangle),
|
cmocka_unit_test(painterDrawRectangle),
|
||||||
cmocka_unit_test(painterDrawLineOctants),
|
cmocka_unit_test(painterDrawLineOctants),
|
||||||
cmocka_unit_test(painterDrawLineWidth),
|
cmocka_unit_test(painterDrawLineWidth),
|
||||||
|
@ -1979,4 +2081,6 @@ M_TEST_SUITE_DEFINE(Image,
|
||||||
cmocka_unit_test(painterDrawCircleArea),
|
cmocka_unit_test(painterDrawCircleArea),
|
||||||
cmocka_unit_test(painterDrawCircleCircumference),
|
cmocka_unit_test(painterDrawCircleCircumference),
|
||||||
cmocka_unit_test(painterDrawCircleOffset),
|
cmocka_unit_test(painterDrawCircleOffset),
|
||||||
|
cmocka_unit_test(painterDrawCircleBlend),
|
||||||
|
cmocka_unit_test(painterDrawCircleInvalid),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue