]> git.sesse.net Git - fjl/blobdiff - driver.c
Do some manual strength reduction.
[fjl] / driver.c
index 06d94d99d553e6aa4e784e22cfc99a4d19216df5..04e236912ca45d56bc4f1a34f16b3c04185112d9 100644 (file)
--- a/driver.c
+++ b/driver.c
@@ -147,11 +147,11 @@ void read_scan(struct byte_source* source, struct jpeg_image* image, huffman_tab
        }
 
        struct bit_source bits;
-       init_bit_source(&bits, byte_source_input_func, source);
+       init_bit_source(&bits, byte_source_input_func, 8, source);
                
        unsigned mcu_x = 0, mcu_y = 0;
 
-       for ( ;; ) {
+       while (!bits.source_eof) {
                for (unsigned c = 0; c < num_components; ++c) {
                        unsigned cn = component_num[c];
                        unsigned stride = image->num_blocks_horizontal * image->hsample[cn] * DCTSIZE;
@@ -194,13 +194,11 @@ void read_scan(struct byte_source* source, struct jpeg_image* image, huffman_tab
                                        uint8_t pixdata[DCTSIZE2];      
                                        idct_choice(coeff, image->idct_data[image->qtable[cn]], pixdata);
 
-                                       for (unsigned y = 0; y < DCTSIZE; ++y) {
-                                               unsigned real_x = (mcu_x * image->hsample[cn] + local_xb) * DCTSIZE;
-                                               unsigned real_y = (mcu_y * image->vsample[cn] + local_yb) * DCTSIZE + y;
-                                       
-                                               memcpy(image->pixel_data[cn] + real_y * stride + real_x,
-                                                      pixdata + y * DCTSIZE,
-                                                      DCTSIZE);
+                                       unsigned real_x = (mcu_x * image->hsample[cn] + local_xb) * DCTSIZE;
+                                       unsigned real_y = (mcu_y * image->vsample[cn] + local_yb) * DCTSIZE;
+                                       uint8_t* dest_pixdata = image->pixel_data[cn] + real_y * stride + real_x;
+                                       for (unsigned y = 0; y < DCTSIZE; ++y, dest_pixdata += stride) {
+                                               memcpy(dest_pixdata, pixdata + y * DCTSIZE, DCTSIZE);
                                        }
                                }
                        }
@@ -214,8 +212,9 @@ void read_scan(struct byte_source* source, struct jpeg_image* image, huffman_tab
                        const int c = 1;
                        if (mcu_y == image->num_blocks_vertical) {
                                unsigned stride = image->num_blocks_horizontal * image->hsample[c] * DCTSIZE;
-                               printf("P5\n%u %u\n255\n", stride, image->height);
-                               fwrite(image->pixel_data[c], stride * image->height, 1, stdout);
+                               unsigned height = image->num_blocks_vertical * image->vsample[c] * DCTSIZE;
+                               printf("P5\n%u %u\n255\n", stride, height);
+                               fwrite(image->pixel_data[c], stride * height, 1, stdout);
                        }
                }
        }
@@ -293,6 +292,9 @@ int main(void)
                case 0xd8:
                        /* SOI */
                        break;
+               case 0xd9:
+                       /* EOI */
+                       exit(0);
                case 0xc4:
                        /* DHT (define Huffman tables) */
                        read_huffman_tables(&tables, byte_source_input_func, &source);