コード例 #1
0
ファイル: DataSet.cs プロジェクト: n1rvana/ZXing.NET
    private void CreateVirtualButtons(ImageTargetBehaviour itb)
    {
        // Allocate array for all Image Targets.
        int    numVirtualButtons    = imageTargetGetNumVirtualButtons(mDataSetPtr, itb.TrackableName);
        IntPtr virtualButtonDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(QCARManager.VirtualButtonData)) * numVirtualButtons);
        IntPtr rectangleDataPtr =
            Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VirtualButtonBehaviour.RectangleData)) * numVirtualButtons);

        // Copy Virtual Button data from native.
        imageTargetGetVirtualButtons(virtualButtonDataPtr,
                                     rectangleDataPtr,
                                     numVirtualButtons,
                                     mDataSetPtr,
                                     itb.TrackableName);

        for (int i = 0; i < numVirtualButtons; ++i)
        {
            IntPtr vbPtr = new IntPtr(virtualButtonDataPtr.ToInt32() + i *
                                      Marshal.SizeOf(typeof(QCARManager.VirtualButtonData)));
            QCARManager.VirtualButtonData vbData = (QCARManager.VirtualButtonData)
                                                   Marshal.PtrToStructure(vbPtr, typeof(QCARManager.VirtualButtonData));

            // Do not overwrite existing Virtual Buttons.
            if (mVBBehaviourDict.ContainsKey(vbData.id))
            {
                continue;
            }

            IntPtr rectPtr = new IntPtr(rectangleDataPtr.ToInt32() + i *
                                        Marshal.SizeOf(typeof(VirtualButtonBehaviour.RectangleData)));
            VirtualButtonBehaviour.RectangleData rectData = (VirtualButtonBehaviour.RectangleData)
                                                            Marshal.PtrToStructure(rectPtr, typeof(VirtualButtonBehaviour.RectangleData));

            // QCAR support names up to 64 characters in length, but here we allocate
            // a slightly larger buffer:
            int nameLength = 128;
            System.Text.StringBuilder vbName = new System.Text.StringBuilder(nameLength);
            if (imageTargetGetVirtualButtonName(mDataSetPtr, itb.TrackableName,
                                                i, vbName, nameLength) == 0)
            {
                Debug.LogError("Failed to get virtual button name.");
                continue;
            }

            VirtualButtonBehaviour vbb = CreateVirtualButton(
                vbData.id, vbName.ToString(),
                new Vector2(rectData.leftTopX, rectData.leftTopY),
                new Vector2(rectData.rightBottomX, rectData.rightBottomY),
                itb);

            mVBBehaviourDict.Add(vbData.id, vbb);
        }

        Marshal.FreeHGlobal(virtualButtonDataPtr);
        Marshal.FreeHGlobal(rectangleDataPtr);
    }
コード例 #2
0
ファイル: ImageTracker.cs プロジェクト: n1rvana/ZXing.NET
    // Update Virtual Button states.
    public void UpdateVirtualButtons(int numVirtualButtons, IntPtr virtualButtonPtr)
    {
        for (int i = 0; i < numVirtualButtons; i++)
        {
            IntPtr vbPtr = new IntPtr(virtualButtonPtr.ToInt32() + i *
                                      Marshal.SizeOf(typeof(QCARManager.VirtualButtonData)));
            QCARManager.VirtualButtonData vbData = (QCARManager.VirtualButtonData)
                                                   Marshal.PtrToStructure(vbPtr, typeof(QCARManager.VirtualButtonData));

            VirtualButtonBehaviour vb = null;
            if (mActiveDataSet.TryGetVirtualButtonByID(vbData.id, out vb))
            {
                ImageTargetBehaviour it = vb.GetImageTarget();
                if (it != null && it.enabled && vb.enabled)
                {
                    vb.OnTrackerUpdated(vbData.isPressed > 0);
                }
            }
        }
    }