public static void drawThumbnails(NvgContext vg, float x, float y, float w, float h, int[] images, float t) { float cornerRadius = 3.0f; Paint shadowPaint, imgPaint, fadePaint; float ix, iy, iw, ih; float thumb = 60.0f; float arry = 30.5f; int imgw, imgh; float stackh = (images.Length / 2) * (thumb + 10) + 10; int i; float u = (1 + (float)Math.Cos(t * 0.5f)) * 0.5f; float u2 = (1 - (float)Math.Cos(t * 0.2f)) * 0.5f; float scrollh, dv; vg.Save(); // ClearState(vg); // Drop shadow shadowPaint = vg.BoxGradient(x, y + 4, w, h, cornerRadius * 2, 20, new Color(0, 0, 0, 128), new Color(0, 0, 0, 0)); vg.BeginPath(); vg.Rect(x - 10, y - 10, w + 20, h + 30); vg.RoundedRect(x, y, w, h, cornerRadius); vg.PathWinding(Solidity.Hole); vg.FillPaint(shadowPaint); vg.Fill(); // Window vg.BeginPath(); vg.RoundedRect(x, y, w, h, cornerRadius); vg.MoveTo(x - 10, y + arry); vg.LineTo(x + 1, y + arry - 11); vg.LineTo(x + 1, y + arry + 11); vg.FillColor(new Color(200, 200, 200, 255)); vg.Fill(); vg.Save(); vg.Scissor(x, y, w, h); vg.Translate(0, -(stackh - h) * u); dv = 1.0f / (float)(images.Length - 1); for (i = 0; i < images.Length; i++) { float tx, ty, v, a; tx = x + 10; ty = y + 10; tx += (i % 2) * (thumb + 10); ty += (i / 2) * (thumb + 10); vg.ImageSize(images[i], out imgw, out imgh); if (imgw < imgh) { iw = thumb; ih = iw * (float)imgh / (float)imgw; ix = 0; iy = -(ih - thumb) * 0.5f; } else { ih = thumb; iw = ih * (float)imgw / (float)imgh; ix = -(iw - thumb) * 0.5f; iy = 0; } v = i * dv; a = clampf((u2 - v) / dv, 0, 1); if (a < 1.0f) { drawSpinner(vg, tx + thumb / 2, ty + thumb / 2, thumb * 0.25f, t); } imgPaint = vg.ImagePattern(tx + ix, ty + iy, iw, ih, 0.0f / 180.0f * (float)Math.PI, images[i], a); vg.BeginPath(); vg.RoundedRect(tx, ty, thumb, thumb, 5); vg.FillPaint(imgPaint); vg.Fill(); shadowPaint = vg.BoxGradient(tx - 1, ty, thumb + 2, thumb + 2, 5, 3, new Color(0, 0, 0, 128), new Color(0, 0, 0, 0)); vg.BeginPath(); vg.Rect(tx - 5, ty - 5, thumb + 10, thumb + 10); vg.RoundedRect(tx, ty, thumb, thumb, 6); vg.PathWinding(Solidity.Hole); vg.FillPaint(shadowPaint); vg.Fill(); vg.BeginPath(); vg.RoundedRect(tx + 0.5f, ty + 0.5f, thumb - 1, thumb - 1, 4 - 0.5f); vg.StrokeWidth(1.0f); vg.StrokeColor(new Color(255, 255, 255, 192)); vg.Stroke(); } vg.Restore(); // Hide fades fadePaint = vg.LinearGradient(x, y, x, y + 6, new Color(200, 200, 200, 255), new Color(200, 200, 200, 0)); vg.BeginPath(); vg.Rect(x + 4, y, w - 8, 6); vg.FillPaint(fadePaint); vg.Fill(); fadePaint = vg.LinearGradient(x, y + h, x, y + h - 6, new Color(200, 200, 200, 255), new Color(200, 200, 200, 0)); vg.BeginPath(); vg.Rect(x + 4, y + h - 6, w - 8, 6); vg.FillPaint(fadePaint); vg.Fill(); // Scroll bar shadowPaint = vg.BoxGradient(x + w - 12 + 1, y + 4 + 1, 8, h - 8, 3, 4, new Color(0, 0, 0, 32), new Color(0, 0, 0, 92)); vg.BeginPath(); vg.RoundedRect(x + w - 12, y + 4, 8, h - 8, 3); vg.FillPaint(shadowPaint); // vg.FillColor(new Color(255,0,0,128)); vg.Fill(); scrollh = (h / stackh) * (h - 8); shadowPaint = vg.BoxGradient(x + w - 12 - 1, y + 4 + (h - 8 - scrollh) * u - 1, 8, scrollh, 3, 4, new Color(220, 220, 220, 255), new Color(128, 128, 128, 255)); vg.BeginPath(); vg.RoundedRect(x + w - 12 + 1, y + 4 + 1 + (h - 8 - scrollh) * u, 8 - 2, scrollh - 2, 2); vg.FillPaint(shadowPaint); // vg.FillColor(new Color(0,0,0,128)); vg.Fill(); vg.Restore(); }