Skip to content

Commit d477863

Browse files
authored
Added simple bitmap rectangle drawing methods for more common operations (#2399)
1 parent 427d605 commit d477863

File tree

4 files changed

+195
-7
lines changed

4 files changed

+195
-7
lines changed

src/nanoFramework.Graphics/Graphics/Core/GraphicsDriver.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -567,12 +567,16 @@ void GraphicsDriver::DrawRoundedRectangleNative(
567567
FillRectangleNative(bitmap, brush, fillRect);
568568
}
569569

570-
EllipseAlgorithm(bitmap, radiusX, radiusY, &params, &Draw4PointsRoundedRect);
570+
// Outline
571+
if (pen.thickness > 0)
572+
{
573+
EllipseAlgorithm(bitmap, radiusX, radiusY, &params, &Draw4PointsRoundedRect);
571574

572-
DrawBresLineNative(bitmap, params.x1, y, params.x2, y, pen);
573-
DrawBresLineNative(bitmap, x, params.y1, x, params.y2, pen);
574-
DrawBresLineNative(bitmap, x2, params.y1, x2, params.y2, pen);
575-
DrawBresLineNative(bitmap, params.x1, y2, params.x2, y2, pen);
575+
DrawBresLineNative(bitmap, params.x1, y, params.x2, y, pen);
576+
DrawBresLineNative(bitmap, x, params.y1, x, params.y2, pen);
577+
DrawBresLineNative(bitmap, x2, params.y1, x2, params.y2, pen);
578+
DrawBresLineNative(bitmap, params.x1, y2, params.x2, y2, pen);
579+
}
576580
}
577581
}
578582

src/nanoFramework.Graphics/Graphics/Native/nanoFramework_Graphics.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,12 @@ static const CLR_RT_MethodHandler method_lookup[] =
130130
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::MakeTransparent___VOID__nanoFrameworkPresentationMediaColor,
131131
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::StretchImage___VOID__I4__I4__nanoFrameworkUIBitmap__I4__I4__U2,
132132
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::DrawLine___VOID__nanoFrameworkPresentationMediaColor__I4__I4__I4__I4__I4,
133+
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::DrawRectangle___VOID__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor,
133134
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::DrawRectangle___VOID__nanoFrameworkPresentationMediaColor__I4__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__U2,
135+
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::DrawRoundRectangle___VOID__I4__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor,
136+
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::FillRectangle___VOID__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__U2,
137+
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::FillRoundRectangle___VOID__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__U2,
138+
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::FillGradientRectangle___VOID__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__U2,
134139
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::DrawText___VOID__STRING__nanoFrameworkUIFont__nanoFrameworkPresentationMediaColor__I4__I4,
135140
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::SetPixel___VOID__I4__I4__nanoFrameworkPresentationMediaColor,
136141
Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::GetPixel___nanoFrameworkPresentationMediaColor__I4__I4,
@@ -978,9 +983,9 @@ static const CLR_RT_MethodHandler method_lookup[] =
978983
const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_Graphics =
979984
{
980985
"nanoFramework.Graphics",
981-
0xD528A218,
986+
0x7BD8E418,
982987
method_lookup,
983-
{ 100, 0, 0, 5 }
988+
{ 100, 0, 0, 6 }
984989
};
985990

986991
// clang-format on

src/nanoFramework.Graphics/Graphics/Native/nanoFramework_Graphics.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,14 @@ struct Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap
171171
NANOCLR_NATIVE_DECLARE(MakeTransparent___VOID__nanoFrameworkPresentationMediaColor);
172172
NANOCLR_NATIVE_DECLARE(StretchImage___VOID__I4__I4__nanoFrameworkUIBitmap__I4__I4__U2);
173173
NANOCLR_NATIVE_DECLARE(DrawLine___VOID__nanoFrameworkPresentationMediaColor__I4__I4__I4__I4__I4);
174+
NANOCLR_NATIVE_DECLARE(DrawRectangle___VOID__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor);
174175
NANOCLR_NATIVE_DECLARE(
175176
DrawRectangle___VOID__nanoFrameworkPresentationMediaColor__I4__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__U2);
177+
NANOCLR_NATIVE_DECLARE(DrawRoundRectangle___VOID__I4__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor);
178+
NANOCLR_NATIVE_DECLARE(FillRectangle___VOID__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__U2);
179+
NANOCLR_NATIVE_DECLARE(FillRoundRectangle___VOID__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__U2);
180+
NANOCLR_NATIVE_DECLARE(
181+
FillGradientRectangle___VOID__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__U2);
176182
NANOCLR_NATIVE_DECLARE(DrawText___VOID__STRING__nanoFrameworkUIFont__nanoFrameworkPresentationMediaColor__I4__I4);
177183
NANOCLR_NATIVE_DECLARE(SetPixel___VOID__I4__I4__nanoFrameworkPresentationMediaColor);
178184
NANOCLR_NATIVE_DECLARE(GetPixel___nanoFrameworkPresentationMediaColor__I4__I4);

src/nanoFramework.Graphics/Graphics/Native/nanoFramework_Graphics_nanoFramework_UI_Bitmap.cpp

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,179 @@ HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
534534
NANOCLR_NOCLEANUP();
535535
}
536536

537+
HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
538+
DrawRectangle___VOID__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor(CLR_RT_StackFrame &stack)
539+
{
540+
NANOCLR_HEADER();
541+
542+
CLR_RT_HeapBlock *pArgs;
543+
CLR_GFX_Bitmap *bitmap;
544+
GFX_Pen pen;
545+
GFX_Brush brush;
546+
GFX_Rect rectangle;
547+
548+
NANOCLR_CHECK_HRESULT(GetBitmap(stack, true, bitmap));
549+
550+
pArgs = &(stack.Arg1());
551+
552+
rectangle.left = pArgs[0].NumericByRef().s4;
553+
rectangle.top = pArgs[1].NumericByRef().s4;
554+
rectangle.right = rectangle.left + pArgs[2].NumericByRef().s4 - 1;
555+
rectangle.bottom = rectangle.top + pArgs[3].NumericByRef().s4 - 1;
556+
557+
pen.thickness = pArgs[4].NumericByRef().s4;
558+
pen.color = pArgs[5].NumericByRef().u4;
559+
560+
// No fill
561+
brush.opacity = PAL_GFX_Bitmap::c_OpacityTransparent;
562+
563+
bitmap->DrawRectangle(pen, brush, rectangle);
564+
565+
NANOCLR_NOCLEANUP();
566+
}
567+
568+
HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
569+
DrawRoundRectangle___VOID__I4__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor(CLR_RT_StackFrame &stack)
570+
{
571+
NANOCLR_HEADER();
572+
573+
CLR_RT_HeapBlock *pArgs;
574+
CLR_GFX_Bitmap *bitmap;
575+
GFX_Pen pen;
576+
GFX_Brush brush;
577+
GFX_Rect rectangle;
578+
int radiusX;
579+
int radiusY;
580+
581+
NANOCLR_CHECK_HRESULT(GetBitmap(stack, true, bitmap));
582+
583+
pArgs = &(stack.Arg1());
584+
585+
rectangle.left = pArgs[0].NumericByRef().s4;
586+
rectangle.top = pArgs[1].NumericByRef().s4;
587+
rectangle.right = rectangle.left + pArgs[2].NumericByRef().s4 - 1;
588+
rectangle.bottom = rectangle.top + pArgs[3].NumericByRef().s4 - 1;
589+
590+
pen.thickness = pArgs[4].NumericByRef().s4;
591+
pen.color = pArgs[7].NumericByRef().u4;
592+
593+
radiusX = pArgs[5].NumericByRef().s4;
594+
radiusY = pArgs[6].NumericByRef().s4;
595+
596+
// No fill
597+
brush.opacity = PAL_GFX_Bitmap::c_OpacityTransparent;
598+
599+
bitmap->DrawRoundedRectangle(pen, brush, rectangle, radiusX, radiusY);
600+
601+
NANOCLR_NOCLEANUP();
602+
}
603+
604+
HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
605+
FillRectangle___VOID__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__U2(CLR_RT_StackFrame &stack)
606+
{
607+
NANOCLR_HEADER();
608+
609+
CLR_RT_HeapBlock *pArgs;
610+
CLR_GFX_Bitmap *bitmap;
611+
GFX_Pen pen;
612+
GFX_Brush brush;
613+
GFX_Rect rectangle;
614+
615+
NANOCLR_CHECK_HRESULT(GetBitmap(stack, true, bitmap));
616+
617+
pArgs = &(stack.Arg1());
618+
619+
rectangle.left = pArgs[0].NumericByRef().s4;
620+
rectangle.top = pArgs[1].NumericByRef().s4;
621+
rectangle.right = rectangle.left + pArgs[2].NumericByRef().s4 - 1;
622+
rectangle.bottom = rectangle.top + pArgs[3].NumericByRef().s4 - 1;
623+
624+
// No outline
625+
pen.thickness = 0;
626+
627+
brush.gradientStartColor = pArgs[4].NumericByRef().u4;
628+
brush.gradientEndColor = brush.gradientStartColor;
629+
brush.opacity = pArgs[5].NumericByRef().u2;
630+
631+
bitmap->DrawRectangle(pen, brush, rectangle);
632+
633+
NANOCLR_NOCLEANUP();
634+
}
635+
636+
HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
637+
FillRoundRectangle___VOID__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__U2(CLR_RT_StackFrame &stack)
638+
{
639+
NANOCLR_HEADER();
640+
641+
CLR_RT_HeapBlock *pArgs;
642+
CLR_GFX_Bitmap *bitmap;
643+
GFX_Pen pen;
644+
GFX_Brush brush;
645+
GFX_Rect rectangle;
646+
int radiusX;
647+
int radiusY;
648+
649+
NANOCLR_CHECK_HRESULT(GetBitmap(stack, true, bitmap));
650+
651+
pArgs = &(stack.Arg1());
652+
653+
rectangle.left = pArgs[0].NumericByRef().s4;
654+
rectangle.top = pArgs[1].NumericByRef().s4;
655+
rectangle.right = rectangle.left + pArgs[2].NumericByRef().s4 - 1;
656+
rectangle.bottom = rectangle.top + pArgs[3].NumericByRef().s4 - 1;
657+
658+
radiusX = pArgs[4].NumericByRef().s4;
659+
radiusY = pArgs[5].NumericByRef().s4;
660+
661+
// No outline
662+
pen.thickness = 0;
663+
664+
brush.gradientStartColor = pArgs[6].NumericByRef().u4;
665+
brush.gradientEndColor = brush.gradientStartColor;
666+
brush.opacity = pArgs[7].NumericByRef().u2;
667+
668+
bitmap->DrawRoundedRectangle(pen, brush, rectangle, radiusX, radiusY);
669+
670+
NANOCLR_NOCLEANUP();
671+
}
672+
673+
HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
674+
FillGradientRectangle___VOID__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__U2(
675+
CLR_RT_StackFrame &stack)
676+
{
677+
NANOCLR_HEADER();
678+
679+
CLR_RT_HeapBlock *pArgs;
680+
CLR_GFX_Bitmap *bitmap;
681+
GFX_Pen pen;
682+
GFX_Brush brush;
683+
GFX_Rect rectangle;
684+
685+
NANOCLR_CHECK_HRESULT(GetBitmap(stack, true, bitmap));
686+
687+
pArgs = &(stack.Arg1());
688+
689+
rectangle.left = pArgs[0].NumericByRef().s4;
690+
rectangle.top = pArgs[1].NumericByRef().s4;
691+
rectangle.right = rectangle.left + pArgs[2].NumericByRef().s4 - 1;
692+
rectangle.bottom = rectangle.top + pArgs[3].NumericByRef().s4 - 1;
693+
694+
// No outline
695+
pen.thickness = 0;
696+
697+
brush.gradientStartColor = pArgs[4].NumericByRef().u4;
698+
brush.gradientStartX = pArgs[5].NumericByRef().s4;
699+
brush.gradientStartY = pArgs[6].NumericByRef().s4;
700+
brush.gradientEndColor = pArgs[7].NumericByRef().u4;
701+
brush.gradientEndX = pArgs[8].NumericByRef().s4;
702+
brush.gradientEndY = pArgs[9].NumericByRef().s4;
703+
brush.opacity = pArgs[10].NumericByRef().u2;
704+
705+
bitmap->DrawRectangle(pen, brush, rectangle);
706+
707+
NANOCLR_NOCLEANUP();
708+
}
709+
537710
HRESULT Library_nanoFramework_Graphics_nanoFramework_UI_Bitmap::
538711
DrawRectangle___VOID__nanoFrameworkPresentationMediaColor__I4__I4__I4__I4__I4__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__nanoFrameworkPresentationMediaColor__I4__I4__U2(
539712
CLR_RT_StackFrame &stack)

0 commit comments

Comments
 (0)