Esempio n. 1
0
        /// <summary>
        /// Fetches an image surface from a named file.
        /// </summary>
        /// <param name="capi">The Client API</param>
        /// <param name="texFileName">The name of the text file.</param>
        /// <returns></returns>
        public static ImageSurface getImageSurfaceFromAsset(ICoreClientAPI capi, string texFileName)
        {
            byte[] pngdata = capi.Assets.Get("textures/" + texFileName).Data;

            BitmapExternal bitmap = (BitmapExternal)capi.Render.BitmapCreateFromPng(pngdata);

            BitmapData bmp_data = bitmap.bmp.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.bmp.Width, bitmap.bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

            ImageSurface imageSurface = new ImageSurface(Format.Argb32, bitmap.bmp.Width, bitmap.bmp.Height);

            unsafe
            {
                uint *destPixels   = (uint *)imageSurface.DataPtr.ToPointer();
                uint *sourcePixels = (uint *)bmp_data.Scan0.ToPointer();

                int size = bitmap.bmp.Width * bitmap.bmp.Height;

                for (int i = 0; i < size; i++)
                {
                    destPixels[i] = sourcePixels[i];
                }
            }

            imageSurface.MarkDirty();


            bitmap.bmp.UnlockBits(bmp_data);
            bitmap.Dispose();

            return(imageSurface);
        }
Esempio n. 2
0
 public bool AddTextures(ref Dictionary <string, Queue <byte> > buffdat, ref Dictionary <AssetLocation, TextureAtlasPosition> texMapping, AssetLocation meshKey, string bufferKey)
 {
     if (buffdat.ContainsKey(bufferKey))
     {
         byte[]         texbytes = buffdat[bufferKey]?.ToArray();
         BitmapExternal bitmap   = capi.Render.BitmapCreateFromPng(texbytes);
         if (!capi.BlockTextureAtlas.InsertTexture(bitmap, out int id, out TextureAtlasPosition position))
         {
             capi.World.Logger.Debug("Failed adding baked in gltf texture to atlas from: {0}, texture probably too large.", meshKey);
             texMapping[meshKey] = capi.BlockTextureAtlas[new AssetLocation("unknown")];
         }
         else
         {
             texMapping[meshKey] = position;
             return(true);
         }
     }
        /// <summary>
        /// Recomposes a multi-line message.
        /// </summary>
        /// <param name="versionnumber">The version number of the new version.</param>
        public void RecomposeMultiLine(string versionnumber)
        {
            text = Lang.Get("versionavailable", versionnumber);

            Bounds.fixedHeight = GetMultilineTextHeight() / RuntimeEnv.GUIScale;
            Bounds.CalcWorldBounds();

            offsetY = -2 * Bounds.fixedHeight;

            ImageSurface surface = new ImageSurface(Format.Argb32, (int)Bounds.OuterWidth, (int)Bounds.OuterHeight + shadowHeight);
            Context      ctx     = genContext(surface);

            double iconX    = scaled(15);
            double iconSize = scaled(14);
            double iconY    = (Bounds.InnerHeight - iconSize) / 2;

            double[] bgc = GuiStyle.DarkBrownColor;
            bgc[0] /= 2;
            bgc[1] /= 2;
            bgc[2] /= 2;
            LinearGradient gradient = new LinearGradient(0, Bounds.OuterHeightInt, 0, Bounds.OuterHeightInt + 10);

            gradient.AddColorStop(0, new Color(bgc[0], bgc[1], bgc[2], 1));
            gradient.AddColorStop(1, new Color(bgc[0], bgc[1], bgc[2], 0));
            ctx.SetSource(gradient);
            ctx.Rectangle(0, Bounds.OuterHeightInt, Bounds.OuterWidthInt, Bounds.OuterHeightInt + 10);
            ctx.Fill();
            gradient.Dispose();


            gradient = new LinearGradient(0, 0, Bounds.OuterWidth, 0);
            gradient.AddColorStop(0, new Color(backColor[0], backColor[1], backColor[2], 1));
            gradient.AddColorStop(0.99, new Color(backColor[0], backColor[1], backColor[2], 1));
            gradient.AddColorStop(1, new Color(backColor[0], backColor[1], backColor[2], 0));
            ctx.SetSource(gradient);
            ctx.Rectangle(0, 0, Bounds.OuterWidthInt, Bounds.OuterHeightInt);
            ctx.Fill();
            gradient.Dispose();

            ctx.Arc(Bounds.drawX + iconX, Bounds.OuterHeight / 2, iconSize / 2 + scaled(4), 0, Math.PI * 2);
            ctx.SetSourceRGBA(GuiStyle.DarkBrownColor);
            ctx.Fill();

            double fontheight = Font.GetFontExtents().Height;

            byte[]         pngdata = api.Assets.Get("textures/gui/newversion.png").Data;
            BitmapExternal bitmap  = (BitmapExternal)api.Render.BitmapCreateFromPng(pngdata);

            surface.Image(bitmap.bmp, (int)(Bounds.drawX + iconX - iconSize / 2), (int)(Bounds.drawY + iconY), (int)iconSize, (int)iconSize);
            bitmap.Dispose();

            DrawMultilineTextAt(ctx, Bounds.drawX + iconX + 20, Bounds.drawY);

            generateTexture(surface, ref texture);
            ctx.Dispose();
            surface.Dispose();


            surface = new ImageSurface(Format.Argb32, (int)Bounds.OuterWidth, (int)Bounds.OuterHeight);
            ctx     = genContext(surface);

            ctx.SetSourceRGBA(1, 1, 1, 0.1);
            ctx.Paint();

            generateTexture(surface, ref hoverTexture);

            ctx.Dispose();
            surface.Dispose();
        }