func drawScissor(ctx *nanovgo.Context, x, y, t float32) { ctx.Save() // Draw first rect and set scissor to it's area. ctx.Translate(x, y) ctx.Rotate(nanovgo.DegToRad(5)) ctx.BeginPath() ctx.Rect(-20, -20, 60, 40) ctx.SetFillColor(nanovgo.RGBA(255, 0, 0, 255)) ctx.Fill() ctx.Scissor(-20, -20, 60, 40) // Draw second rectangle with offset and rotation. ctx.Translate(40, 0) ctx.Rotate(t) // Draw the intended second rectangle without any scissoring. ctx.Save() ctx.ResetScissor() ctx.BeginPath() ctx.Rect(-20, -10, 60, 30) ctx.SetFillColor(nanovgo.RGBA(255, 128, 0, 64)) ctx.Fill() ctx.Restore() // Draw second rectangle with combined scissoring. ctx.IntersectScissor(-20, -10, 60, 30) ctx.BeginPath() ctx.Rect(-20, -10, 60, 30) ctx.SetFillColor(nanovgo.RGBA(255, 128, 0, 255)) ctx.Fill() ctx.Restore() }
func RenderDemo(ctx *nanovgo.Context, mx, my, width, height, t float32, blowup bool, data *DemoData) { drawEyes(ctx, width-250, 50, 150, 100, mx, my, t) drawParagraph(ctx, width-450, 50, 150, 100, mx, my) drawGraph(ctx, 0, height/2, width, height/2, t) drawColorWheel(ctx, width-300, height-300, 250.0, 250.0, t) // Line joints drawLines(ctx, 120, height-50, 600, 50, t) // Line widths drawWidths(ctx, 10, 50, 30) // Line caps drawCaps(ctx, 10, 300, 30) drawScissor(ctx, 50, height-80, t) ctx.Save() defer ctx.Restore() if blowup { ctx.Rotate(sinF(t*0.3) * 5.0 / 180.0 * nanovgo.PI) ctx.Scale(2.0, 2.0) } // Widgets drawWindow(ctx, "Widgets `n Stuff", 50, 50, 300, 400) var x float32 = 60.0 var y float32 = 95.0 drawSearchBox(ctx, "Search", x, y, 280, 25) y += 40 drawDropDown(ctx, "Effects", x, y, 280, 28) popy := y + 14 y += 45 // Form drawLabel(ctx, "Login", x, y, 280, 20) y += 25 drawEditBox(ctx, "Email", x, y, 280, 28) y += 35 drawEditBox(ctx, "Password", x, y, 280, 28) y += 38 drawCheckBox(ctx, "Remember me", x, y, 140, 28) drawButton(ctx, IconLOGIN, "Sign in", x+138, y, 140, 28, nanovgo.RGBA(0, 96, 128, 255)) y += 45 // Slider drawLabel(ctx, "Diameter", x, y, 280, 20) y += 25 drawEditBoxNum(ctx, "123.00", "px", x+180, y, 100, 28) drawSlider(ctx, 0.4, x, y, 170, 28) y += 55 drawButton(ctx, IconTRASH, "Delete", x, y, 160, 28, nanovgo.RGBA(128, 16, 8, 255)) drawButton(ctx, 0, "Cancel", x+170, y, 110, 28, nanovgo.RGBA(0, 0, 0, 0)) // Thumbnails box drawThumbnails(ctx, 365, popy-30, 160, 300, data.Images, t) }
func (c *ColorWheel) Draw(self Widget, ctx *nanovgo.Context) { c.WidgetImplement.Draw(self, ctx) if !c.visible { return } x := float32(c.x) y := float32(c.y) w := float32(c.w) h := float32(c.h) ctx.Save() defer ctx.Restore() cx := x + w*0.5 cy := y + h*0.5 r1 := toF(w < h, w, h)*0.5 - 5.0 r0 := r1 * 0.75 aeps := 0.7 / r1 // half a pixel arc length in radians (2pi cancels out). for i := 0; i < 6; i++ { a0 := float32(i)/6.0*nanovgo.PI*2.0 - aeps a1 := float32(i+1)/6.0*nanovgo.PI*2.0 + aeps ctx.BeginPath() ctx.Arc(cx, cy, r0, a0, a1, nanovgo.Clockwise) ctx.Arc(cx, cy, r1, a1, a0, nanovgo.CounterClockwise) ctx.ClosePath() sin1, cos1 := sinCosF(a0) sin2, cos2 := sinCosF(a1) ax := cx + cos1*(r0+r1)*0.5 ay := cy + sin1*(r0+r1)*0.5 bx := cx + cos2*(r0+r1)*0.5 by := cy + sin2*(r0+r1)*0.5 color1 := nanovgo.HSLA(a0/(nanovgo.PI*2), 1.0, 0.55, 255) color2 := nanovgo.HSLA(a1/(nanovgo.PI*2), 1.0, 0.55, 255) paint := nanovgo.LinearGradient(ax, ay, bx, by, color1, color2) ctx.SetFillPaint(paint) ctx.Fill() } ctx.BeginPath() ctx.Circle(cx, cy, r0-0.5) ctx.Circle(cx, cy, r1+0.5) ctx.SetStrokeColor(nanovgo.MONO(0, 64)) ctx.Stroke() // Selector ctx.Save() defer ctx.Restore() ctx.Translate(cx, cy) ctx.Rotate(c.hue * nanovgo.PI * 2) // Marker on u := clampF(r1/50, 1.5, 4.0) ctx.SetStrokeWidth(u) ctx.BeginPath() ctx.Rect(r0-1, -2*u, r1-r0+2, 4*u) ctx.SetStrokeColor(nanovgo.MONO(255, 192)) ctx.Stroke() paint := nanovgo.BoxGradient(r0-3, -5, r1-r0+6, 10, 2, 4, nanovgo.MONO(0, 128), nanovgo.MONO(0, 0)) ctx.BeginPath() ctx.Rect(r0-2-10, -4-10, r1-r0+4+20, 8+20) ctx.Rect(r0-2, -4, r1-r0+4, 8) ctx.PathWinding(nanovgo.Hole) ctx.SetFillPaint(paint) ctx.Fill() // Center triangle r := r0 - 6 sin1, cos1 := sinCosF(120.0 / 180.0 * nanovgo.PI) sin2, cos2 := sinCosF(-120.0 / 180.0 * nanovgo.PI) ax := cos1 * r ay := sin1 * r bx := cos2 * r by := sin2 * r ctx.BeginPath() ctx.MoveTo(r, 0) ctx.LineTo(ax, ay) ctx.LineTo(bx, by) ctx.ClosePath() triPaint1 := nanovgo.LinearGradient(r, 0, ax, ay, nanovgo.HSL(c.hue, 1.0, 0.5), nanovgo.MONO(255, 255)) ctx.SetFillPaint(triPaint1) ctx.Fill() triPaint2 := nanovgo.LinearGradient((r+ax)*0.5, ay*0.5, bx, by, nanovgo.MONO(0, 0), nanovgo.MONO(0, 255)) ctx.SetFillPaint(triPaint2) ctx.Fill() // selector circle on triangle px, py := c.calculatePosition() ctx.SetStrokeWidth(u) ctx.BeginPath() ctx.Circle(px, py, 2*u) ctx.SetStrokeColor(nanovgo.MONO(255, 192)) ctx.Stroke() }
func drawColorWheel(ctx *nanovgo.Context, x, y, w, h, t float32) { var r0, r1, ax, ay, bx, by, aeps, r float32 hue := sinF(t * 0.12) ctx.Save() defer ctx.Restore() /* ctx.BeginPath() ctx.Rect(x,y,w,h) ctx.FillColor(nanovgo.RGBA(255,0,0,128)) ctx.Fill()*/ cx := x + w*0.5 cy := y + h*0.5 if w < h { r1 = w*0.5 - 5.0 } else { r1 = h*0.5 - 5.0 } r0 = r1 - 20.0 aeps = 0.5 / r1 // half a pixel arc length in radians (2pi cancels out). for i := 0; i < 6; i++ { a0 := float32(i)/6.0*nanovgo.PI*2.0 - aeps a1 := float32(i+1.0)/6.0*nanovgo.PI*2.0 + aeps ctx.BeginPath() ctx.Arc(cx, cy, r0, a0, a1, nanovgo.Clockwise) ctx.Arc(cx, cy, r1, a1, a0, nanovgo.CounterClockwise) ctx.ClosePath() ax = cx + cosF(a0)*(r0+r1)*0.5 ay = cy + sinF(a0)*(r0+r1)*0.5 bx = cx + cosF(a1)*(r0+r1)*0.5 by = cy + sinF(a1)*(r0+r1)*0.5 paint := nanovgo.LinearGradient(ax, ay, bx, by, nanovgo.HSLA(a0/(nanovgo.PI*2), 1.0, 0.55, 255), nanovgo.HSLA(a1/(nanovgo.PI*2), 1.0, 0.55, 255)) ctx.SetFillPaint(paint) ctx.Fill() } ctx.BeginPath() ctx.Circle(cx, cy, r0-0.5) ctx.Circle(cx, cy, r1+0.5) ctx.SetStrokeColor(nanovgo.RGBA(0, 0, 0, 64)) ctx.SetStrokeWidth(1.0) ctx.Stroke() // Selector ctx.Translate(cx, cy) ctx.Rotate(hue * nanovgo.PI * 2) // Marker on ctx.SetStrokeWidth(2.0) ctx.BeginPath() ctx.Rect(r0-1, -3, r1-r0+2, 6) ctx.SetStrokeColor(nanovgo.RGBA(255, 255, 255, 192)) ctx.Stroke() paint := nanovgo.BoxGradient(r0-3, -5, r1-r0+6, 10, 2, 4, nanovgo.RGBA(0, 0, 0, 128), nanovgo.RGBA(0, 0, 0, 0)) ctx.BeginPath() ctx.Rect(r0-2-10, -4-10, r1-r0+4+20, 8+20) ctx.Rect(r0-2, -4, r1-r0+4, 8) ctx.PathWinding(nanovgo.Hole) ctx.SetFillPaint(paint) ctx.Fill() // Center triangle r = r0 - 6 ax = cosF(120.0/180.0*nanovgo.PI) * r ay = sinF(120.0/180.0*nanovgo.PI) * r bx = cosF(-120.0/180.0*nanovgo.PI) * r by = sinF(-120.0/180.0*nanovgo.PI) * r ctx.BeginPath() ctx.MoveTo(r, 0) ctx.LineTo(ax, ay) ctx.LineTo(bx, by) ctx.ClosePath() paint = nanovgo.LinearGradient(r, 0, ax, ay, nanovgo.HSLA(hue, 1.0, 0.5, 255), nanovgo.RGBA(255, 255, 255, 255)) ctx.SetFillPaint(paint) ctx.Fill() paint = nanovgo.LinearGradient((r+ax)*0.5, (0+ay)*0.5, bx, by, nanovgo.RGBA(0, 0, 0, 0), nanovgo.RGBA(0, 0, 0, 255)) ctx.SetFillPaint(paint) ctx.Fill() ctx.SetStrokeColor(nanovgo.RGBA(0, 0, 0, 64)) ctx.Stroke() // Select circle on triangle ax = cosF(120.0/180.0*nanovgo.PI) * r * 0.3 ay = sinF(120.0/180.0*nanovgo.PI) * r * 0.4 ctx.SetStrokeWidth(2.0) ctx.BeginPath() ctx.Circle(ax, ay, 5) ctx.SetStrokeColor(nanovgo.RGBA(255, 255, 255, 192)) ctx.Stroke() paint = nanovgo.RadialGradient(ax, ay, 7, 9, nanovgo.RGBA(0, 0, 0, 64), nanovgo.RGBA(0, 0, 0, 0)) ctx.BeginPath() ctx.Rect(ax-20, ay-20, 40, 40) ctx.Circle(ax, ay, 7) ctx.PathWinding(nanovgo.Hole) ctx.SetFillPaint(paint) ctx.Fill() }