home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Archived / Updates / Flash / writeflash / !MakeFlash / c / matrix < prev    next >
Text File  |  2000-04-19  |  3KB  |  96 lines

  1. #include <stdio.h>
  2. //
  3. #include "proto.h"
  4. #include "bucket.h"
  5. #include "matrix.h"
  6. #include "bitcount.h"
  7.  
  8.  
  9. int matrix_read(MATRIX *matrix) {
  10.  
  11.   U32 ok, bits;
  12.  
  13.   matrix_reset(matrix);
  14.  
  15.   if (read_ubits(1, &ok))                   return 1;
  16.   if (ok) {
  17.     if (read_ubits(5, &bits))               return 1;
  18.     if (read_bits(bits, &matrix->scalex))   return 1;
  19.     if (read_bits(bits, &matrix->scaley))   return 1;
  20.   }
  21.  
  22.   if (read_ubits(1, &ok))                   return 1;
  23.   if (ok) {
  24.     if (read_ubits(5, &bits))               return 1;
  25.     if (read_bits(bits, &matrix->rotate0))  return 1;
  26.     if (read_bits(bits, &matrix->rotate1))  return 1;
  27.   }
  28.  
  29.   if (read_ubits(5, &bits))                return 1;
  30.   if (read_bits(bits, &matrix->tx))        return 1;
  31.   if (read_bits(bits, &matrix->ty))        return 1;
  32.  
  33.   return 0;
  34. }
  35.  
  36.  
  37. int matrix_write(MATRIX *matrix) {
  38.  
  39.   int n;
  40.  
  41.   if (flush_bucket())                             return 1;
  42.  
  43.   if ((matrix->scalex != 65536) || (matrix->scaley != 65536)) {
  44.     if (write_ubits(1, 1))                        return 1;
  45.     n = bitcount_signed(matrix->scalex, matrix->scaley, 0, 0);
  46.     if (write_ubits(5, n))                        return 1;
  47.     if (write_bits(n, matrix->scalex))            return 1;
  48.     if (write_bits(n, matrix->scaley))            return 1;
  49.   } else
  50.     if (write_ubits(1, 0))                        return 1;
  51.  
  52.   if ((matrix->rotate0 != 0) || (matrix->rotate1 != 0)) {
  53.     if (write_ubits(1, 1))                        return 1;
  54.     n = bitcount_signed(matrix->rotate0, matrix->rotate1, 0, 0);
  55.     if (write_ubits(5, n))                        return 1;
  56.     if (write_bits(n, matrix->rotate0))           return 1;
  57.     if (write_bits(n, matrix->rotate1))           return 1;
  58.   } else
  59.     if (write_ubits(1, 0))                        return 1;
  60.  
  61.   n = bitcount_signed(matrix->tx, matrix->ty, 0, 0);
  62.   if (write_ubits(5, n))                          return 1;
  63.   if (write_bits(n, matrix->tx))                  return 1;
  64.   if (write_bits(n, matrix->ty))                  return 1;
  65.  
  66.   return 0;
  67. }
  68.  
  69.  
  70. U32 matrix_count_bits(MATRIX *matrix) {
  71.  
  72.   U32 bits;
  73.  
  74.   bits = 1;
  75.   if ((matrix->scalex != 65536) || (matrix->scaley != 65536))
  76.     bits += 5 + 2*bitcount_signed(matrix->scalex, matrix->scaley, 0, 0);
  77.  
  78.   // rotate/skew
  79.   bits += 1;
  80.   if ((matrix->rotate0 != 0) || (matrix->rotate1 != 0))
  81.     bits += 5 + 2*bitcount_signed(matrix->rotate0, matrix->rotate1, 0, 0);
  82.  
  83.   // translate
  84.   bits += 5 + 2*bitcount_signed(matrix->tx, matrix->ty, 0, 0);
  85.  
  86.   return bits;
  87. }
  88.  
  89.  
  90. void matrix_reset(MATRIX *matrix) {
  91.  
  92.   matrix->scalex = matrix->scaley = 65536;
  93.   matrix->rotate0 = matrix->rotate1 = 0;
  94.   matrix->tx = matrix->ty = 0;
  95. }
  96.