OSDN Git Service

[Backup]NyARToolkit for Java
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / core2 / rasteranalyzer / threshold / NyARRasterThresholdAnalyzer_SlidePTile.java
index 009c3ac..5b1ef2d 100644 (file)
@@ -50,16 +50,18 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
        /**\r
         * Glayscale(MAX256)のヒストグラム計算クラス\r
         */\r
-       final class CreateHistgramImpl_INT1D_GLAY_8 implements ICreateHistgramImpl\r
+       final class CreateHistgramImpl_INT1D_GRAY_8 implements ICreateHistgramImpl\r
        {\r
                public int _v_interval;\r
-               public CreateHistgramImpl_INT1D_GLAY_8(int i_v_interval)\r
+               public CreateHistgramImpl_INT1D_GRAY_8(int i_v_interval)\r
                {\r
                        this._v_interval=i_v_interval;\r
                        return;\r
                }\r
                public int createHistgramImpl(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram)\r
                {\r
+                       assert (i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
+\r
                        int sum=0;\r
                        final int[] input=(int[]) i_reader.getBuffer();\r
                        for (int y = i_size.h-1; y >=0 ; y-=this._v_interval){\r
@@ -73,6 +75,10 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
                        return sum;\r
                }\r
        }\r
+       /**\r
+        * RGB24bitのヒストグラム計算クラス\r
+        *\r
+        */\r
        final class CreateHistgramImpl_BYTE1D_RGB_24 implements ICreateHistgramImpl\r
        {\r
                private int _v_interval;\r
@@ -83,6 +89,10 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
                }\r
                public int createHistgramImpl(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram)\r
                {\r
+                       assert (\r
+                               i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24)||\r
+                               i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24));\r
+                       \r
                        final byte[] input=(byte[]) i_reader.getBuffer();\r
                        final int pix_count=i_size.w;\r
                        final int pix_mod_part=pix_count-(pix_count%8);\r
@@ -120,7 +130,118 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
                        return sum;             \r
                }\r
        }\r
-       private int _persentage;\r
+       /**\r
+        * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
+        *\r
+        */     \r
+    final class CreateHistgramImpl_BYTE1D_B8G8R8X8_32 implements ICreateHistgramImpl\r
+    {\r
+        private int _v_interval;\r
+        public CreateHistgramImpl_BYTE1D_B8G8R8X8_32(int i_v_interval)\r
+        {\r
+            this._v_interval = i_v_interval;\r
+            return;\r
+        }\r
+        public int createHistgramImpl(INyARBufferReader i_reader, NyARIntSize i_size, int[] o_histgram)\r
+        {\r
+            assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32));\r
+            byte[] input = (byte[])i_reader.getBuffer();\r
+            int pix_count = i_size.w;\r
+            int pix_mod_part = pix_count - (pix_count % 8);\r
+            int sum = 0;\r
+            for (int y = i_size.h - 1; y >= 0; y -= this._v_interval)\r
+            {\r
+                sum += i_size.w;\r
+                int pt = y * i_size.w * 4;\r
+                int x, v;\r
+                for (x = pix_count - 1; x >= pix_mod_part; x--)\r
+                {\r
+                    v = ((input[pt + 0] & 0xff) + (input[pt + 1] & 0xff) + (input[pt + 2] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4;\r
+                }\r
+                //タイリング\r
+                for (; x >= 0; x -= 8)\r
+                {\r
+                    v = ((input[pt + 0] & 0xff) + (input[pt + 1] & 0xff) + (input[pt + 2] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 4] & 0xff) + (input[pt + 5] & 0xff) + (input[pt + 6] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 8] & 0xff) + (input[pt + 9] & 0xff) + (input[pt + 10] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 12] & 0xff) + (input[pt + 13] & 0xff) + (input[pt + 14] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 16] & 0xff) + (input[pt + 17] & 0xff) + (input[pt + 18] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 20] & 0xff) + (input[pt + 21] & 0xff) + (input[pt + 22] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 24] & 0xff) + (input[pt + 25] & 0xff) + (input[pt + 26] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 28] & 0xff) + (input[pt + 29] & 0xff) + (input[pt + 30] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4 * 8;\r
+                }\r
+            }\r
+            return sum;\r
+        }\r
+    }  \r
+       /**\r
+        * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
+        *\r
+        */     \r
+    final class CreateHistgramImpl_BYTE1D_X8R8G8B8_32 implements ICreateHistgramImpl\r
+    {\r
+        private int _v_interval;\r
+        public CreateHistgramImpl_BYTE1D_X8R8G8B8_32(int i_v_interval)\r
+        {\r
+            this._v_interval = i_v_interval;\r
+            return;\r
+        }\r
+        public int createHistgramImpl(INyARBufferReader i_reader, NyARIntSize i_size, int[] o_histgram)\r
+        {\r
+            assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32));\r
+            byte[] input = (byte[])i_reader.getBuffer();\r
+            int pix_count = i_size.w;\r
+            int pix_mod_part = pix_count - (pix_count % 8);\r
+            int sum = 0;\r
+            for (int y = i_size.h - 1; y >= 0; y -= this._v_interval)\r
+            {\r
+                sum += i_size.w;\r
+                int pt = y * i_size.w * 4;\r
+                int x, v;\r
+                for (x = pix_count - 1; x >= pix_mod_part; x--)\r
+                {\r
+                    v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4;\r
+                }\r
+                //タイリング\r
+                for (; x >= 0; x -= 8)\r
+                {\r
+                    v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 5] & 0xff) + (input[pt + 6] & 0xff) + (input[pt + 7] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 9] & 0xff) + (input[pt + 10] & 0xff) + (input[pt + 11] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 13] & 0xff) + (input[pt + 14] & 0xff) + (input[pt + 15] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 17] & 0xff) + (input[pt + 18] & 0xff) + (input[pt + 19] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 21] & 0xff) + (input[pt + 22] & 0xff) + (input[pt + 23] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 25] & 0xff) + (input[pt + 26] & 0xff) + (input[pt + 27] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 29] & 0xff) + (input[pt + 30] & 0xff) + (input[pt + 31] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4 * 8;\r
+                }\r
+            }\r
+            return sum;\r
+        }\r
+    }  \r
+\r
+    private int _persentage;\r
        private int _threshold;\r
        private ICreateHistgramImpl _histgram;\r
        \r
@@ -133,17 +254,24 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
        {\r
                assert (0 <= i_persentage && i_persentage <= 50);\r
                this._persentage = i_persentage;\r
-               switch(i_raster_format){\r
-               case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
-               case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
-                       this._histgram=new CreateHistgramImpl_BYTE1D_RGB_24(i_vertical_interval);\r
-                       break;\r
-               case INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8:\r
-                       this._histgram=new CreateHistgramImpl_INT1D_GLAY_8(i_vertical_interval);\r
-                       break;\r
-               default:\r
-                       throw new NyARException();\r
-               }\r
+        switch (i_raster_format)\r
+        {\r
+            case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
+            case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
+                this._histgram = new CreateHistgramImpl_BYTE1D_RGB_24(i_vertical_interval);\r
+                break;\r
+            case INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8:\r
+                this._histgram = new CreateHistgramImpl_INT1D_GRAY_8(i_vertical_interval);\r
+                break;\r
+            case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
+                this._histgram = new CreateHistgramImpl_BYTE1D_B8G8R8X8_32(i_vertical_interval);\r
+                break;\r
+               case INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32:\r
+                       this._histgram = new CreateHistgramImpl_BYTE1D_X8R8G8B8_32(i_vertical_interval);\r
+                       break;\r
+            default:\r
+                throw new NyARException();\r
+        }\r
        }\r
        public void setVerticalInterval(int i_step)\r
        {\r
@@ -153,9 +281,6 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
        private int[] _histgram_buf=new int[256];\r
        public void analyzeRaster(INyARRaster i_input) throws NyARException\r
        {\r
-               final INyARBufferReader buffer_reader=i_input.getBufferReader();        \r
-               assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
-\r
                final int[] histgram = this._histgram_buf;\r
                final NyARIntSize size=i_input.getSize();\r
                \r