예제 #1
0
        public static Value lib_graphics2dtext_glRenderCharTile(VmContext vm, Value[] args)
        {
            object nativeFont = ((ObjectInstance)args[0].internalValue).nativeData[0];

            object[] tileNativeData = ((ObjectInstance)args[1].internalValue).nativeData;
            int      charId         = (int)args[2].internalValue;
            ListImpl sizeOut        = (ListImpl)args[3].internalValue;
            object   bmp            = Graphics2DTextHelper.RenderCharTile(nativeFont, charId, PST_IntBuffer16);

            if ((bmp == null))
            {
                return(vm.globalFalse);
            }
            int width          = PST_IntBuffer16[0];
            int height         = PST_IntBuffer16[1];
            int effectiveLeft  = PST_IntBuffer16[2];
            int effectiveWidth = PST_IntBuffer16[3];

            tileNativeData[0] = bmp;
            tileNativeData[1] = width;
            tileNativeData[2] = height;
            tileNativeData[3] = effectiveLeft;
            tileNativeData[4] = effectiveWidth;
            Interpreter.Vm.CrayonWrapper.clearList(sizeOut);
            Interpreter.Vm.CrayonWrapper.addToList(sizeOut, Interpreter.Vm.CrayonWrapper.buildInteger(vm.globals, width));
            Interpreter.Vm.CrayonWrapper.addToList(sizeOut, Interpreter.Vm.CrayonWrapper.buildInteger(vm.globals, height));
            Interpreter.Vm.CrayonWrapper.addToList(sizeOut, Interpreter.Vm.CrayonWrapper.buildInteger(vm.globals, effectiveLeft));
            Interpreter.Vm.CrayonWrapper.addToList(sizeOut, Interpreter.Vm.CrayonWrapper.buildInteger(vm.globals, effectiveWidth));
            return(vm.globalTrue);
        }
예제 #2
0
        public static Value lib_graphics2dtext_createNativeFont(VmContext vm, Value[] args)
        {
            Value[]        ints = vm.globals.positiveIntegers;
            ObjectInstance nf   = (ObjectInstance)args[0].internalValue;

            object[] nfOut    = nf.nativeData;
            int      fontType = (int)args[1].internalValue;
            string   fontPath = "";

            if ((fontType == 0))
            {
                fontType = (int)args[2].internalValue;
            }
            else
            {
                fontPath = (string)args[2].internalValue;
                if ((fontType == 1))
                {
                    Value res = Interpreter.Vm.CrayonWrapper.resource_manager_getResourceOfType(vm, fontPath, "TTF");
                    if ((res.type == 1))
                    {
                        return(ints[2]);
                    }
                    ListImpl resList = (ListImpl)res.internalValue;
                    if (!(bool)Interpreter.Vm.CrayonWrapper.getItemFromList(resList, 0).internalValue)
                    {
                        return(ints[2]);
                    }
                    fontPath = (string)Interpreter.Vm.CrayonWrapper.getItemFromList(resList, 1).internalValue;
                }
            }
            int fontClass    = 0;
            int fontSize     = (int)args[3].internalValue;
            int red          = (int)args[4].internalValue;
            int green        = (int)args[5].internalValue;
            int blue         = (int)args[6].internalValue;
            int styleBitmask = (int)args[7].internalValue;
            int isBold       = (styleBitmask & 1);
            int isItalic     = (styleBitmask & 2);

            nfOut[0] = Graphics2DTextHelper.CreateNativeFont(fontType, fontClass, fontPath, fontSize, (isBold > 0), (isItalic > 0));
            if ((nfOut[0] == null))
            {
                if ((fontType == 3))
                {
                    return(ints[1]);
                }
                return(ints[2]);
            }
            return(ints[0]);
        }
예제 #3
0
        public static Value lib_graphics2dtext_glGenerateAndLoadTexture(VmContext vm, Value[] args)
        {
            ListImpl xs        = (ListImpl)args[0].internalValue;
            ListImpl ys        = (ListImpl)args[1].internalValue;
            ListImpl tiles     = (ListImpl)args[2].internalValue;
            int      tileCount = xs.size;

            object[][] tileNativeDatas = new object[tileCount][];
            int[]      coordinates     = new int[(tileCount * 4)];
            object[]   nativeData      = null;
            int        i = 0;

            while ((i < tileCount))
            {
                nativeData                 = ((ObjectInstance)Interpreter.Vm.CrayonWrapper.getItemFromList(tiles, i).internalValue).nativeData;
                tileNativeDatas[i]         = nativeData;
                coordinates[(i * 4)]       = (int)Interpreter.Vm.CrayonWrapper.getItemFromList(xs, i).internalValue;
                coordinates[((i * 4) + 1)] = (int)Interpreter.Vm.CrayonWrapper.getItemFromList(ys, i).internalValue;
                coordinates[((i * 4) + 2)] = (int)nativeData[1];
                coordinates[((i * 4) + 3)] = (int)nativeData[2];
                i += 1;
            }
            int height    = ((int)args[3].internalValue - 1);
            int bitWalker = height;

            while ((bitWalker > 0))
            {
                bitWalker = (bitWalker >> 1);
                height    = (height | bitWalker);
            }
            height += 1;
            object textureSheetBitmap = Graphics2DTextHelper.GenerateTextureAndAllocateFloatInfo(tileNativeDatas, coordinates, 1024, height);

            i = 0;
            while ((i < tileCount))
            {
                tileNativeDatas[i][6] = textureSheetBitmap;
                i += 1;
            }
            return(vm.globalNull);
        }
예제 #4
0
 public static Value lib_graphics2dtext_isSystemFontPresent(VmContext vm, Value[] args)
 {
     return(Interpreter.Vm.CrayonWrapper.buildBoolean(vm.globals, Graphics2DTextHelper.IsSystemFontAvailable((string)args[0].internalValue)));
 }
예제 #5
0
        public static Value lib_graphics2dtext_glRenderTextSurface(VmContext vm, Value[] args)
        {
            object[] textureNativeData = ((ObjectInstance)args[0].internalValue).nativeData;
            int[]    xs         = (int[])textureNativeData[1];
            int[]    ys         = (int[])textureNativeData[2];
            int      charCount  = (int)textureNativeData[4];
            int      red        = (int)textureNativeData[5];
            int      green      = (int)textureNativeData[6];
            int      blue       = (int)textureNativeData[7];
            int      leftOffset = (int)args[3].internalValue;
            int      topOffset  = (int)args[4].internalValue;
            int      alpha      = (int)args[5].internalValue;
            ListImpl tileValues = (ListImpl)args[1].internalValue;

            object[] tileNativeData   = null;
            object[] queueData        = ((ObjectInstance)args[2].internalValue).nativeData;
            int[]    queue            = (int[])queueData[0];
            int      queueLength      = (int)queueData[1];
            int      queueCapacity    = queue.Length;
            int      requiredCapacity = (queueLength + (charCount * 16));

            if ((requiredCapacity > queueCapacity))
            {
                queue        = Interpreter.Vm.CrayonWrapper.reallocIntArray(queue, requiredCapacity);
                queueData[0] = queue;
            }
            queueData[1] = requiredCapacity;
            int index     = queueLength;
            int x         = 0;
            int y         = 0;
            int textureId = 0;
            int i         = 0;

            while ((i < charCount))
            {
                tileNativeData = ((ObjectInstance)Interpreter.Vm.CrayonWrapper.getItemFromList(tileValues, i).internalValue).nativeData;
                queue[index]   = 8;
                textureId      = (int)tileNativeData[5];
                if ((textureId == -1))
                {
                    textureId         = Graphics2DTextHelper.LoadOpenGlTexture(tileNativeData[6]);
                    tileNativeData[5] = textureId;
                    tileNativeData[6] = null;
                }
                queue[(index | 1)] = textureId;
                x = (xs[i] + leftOffset);
                y = (ys[i] + topOffset);
                queue[(index | 2)]  = x;
                queue[(index | 3)]  = y;
                queue[(index | 4)]  = (x + (int)tileNativeData[1]);
                queue[(index | 5)]  = (y + (int)tileNativeData[2]);
                queue[(index | 6)]  = (int)tileNativeData[7];
                queue[(index | 7)]  = (int)tileNativeData[8];
                queue[(index | 8)]  = (int)tileNativeData[9];
                queue[(index | 9)]  = (int)tileNativeData[10];
                queue[(index | 10)] = red;
                queue[(index | 11)] = green;
                queue[(index | 12)] = blue;
                queue[(index | 13)] = alpha;
                queue[(index | 14)] = (int)tileNativeData[11];
                queue[(index | 15)] = (int)tileNativeData[12];
                index += 16;
                i     += 1;
            }
            return(vm.globalNull);
        }