/SWFGeometry.m

https://code.google.com/p/xee/ · Objective C · 199 lines · 142 code · 36 blank · 21 comment · 16 complexity · d5dcd3bf18d345d679a67c050efe5b7b MD5 · raw file

  1. #import "SWFGeometry.h"
  2. #import <math.h>
  3. SWFPoint SWFPointOnLine(SWFPoint a,SWFPoint b,float t)
  4. {
  5. return SWFMakePoint(
  6. (float)a.x*(1-t)+(float)b.x*t,
  7. (float)a.y*(1-t)+(float)b.y*t
  8. );
  9. }
  10. SWFRect SWFParseRect(CSHandle *fh)
  11. {
  12. int bits=[fh readBits:5];
  13. int xmin=[fh readSignedBits:bits];
  14. int xmax=[fh readSignedBits:bits];
  15. int ymin=[fh readSignedBits:bits];
  16. int ymax=[fh readSignedBits:bits];
  17. [fh flushReadBits];
  18. return SWFMakeRect(xmin,ymin,xmax-xmin,ymax-ymin);
  19. }
  20. void SWFWriteRect(SWFRect rect,CSHandle *fh)
  21. {
  22. int xmin=rect.x;
  23. int xmax=rect.x+rect.width;
  24. int ymin=rect.y;
  25. int ymax=rect.y+rect.height;
  26. int bits=SWFCountSignedBits4(xmin,xmax,ymin,ymax);
  27. [fh writeSignedBits:5 value:bits];
  28. [fh writeSignedBits:bits value:xmin];
  29. [fh writeSignedBits:bits value:xmax];
  30. [fh writeSignedBits:bits value:ymin];
  31. [fh writeSignedBits:bits value:ymax];
  32. [fh flushWriteBits];
  33. }
  34. SWFMatrix SWFParseMatrix(CSHandle *fh)
  35. {
  36. int a00=1<<16,a01=0,a02=0;
  37. int a10=0,a11=1<<16,a12=0;
  38. if([fh readBits:1])
  39. {
  40. int bits=[fh readBits:5];
  41. a00=[fh readSignedBits:bits];
  42. a11=[fh readSignedBits:bits];
  43. }
  44. if([fh readBits:1])
  45. {
  46. int bits=[fh readBits:5];
  47. a10=[fh readSignedBits:bits];
  48. a01=[fh readSignedBits:bits];
  49. }
  50. int bits=[fh readBits:5];
  51. a02=[fh readSignedBits:bits];
  52. a12=[fh readSignedBits:bits];
  53. [fh flushReadBits];
  54. return SWFMakeMatrix(a00,a01,a02,a10,a11,a12);
  55. }
  56. void SWFWriteMatrix(SWFMatrix mtx,CSHandle *fh)
  57. {
  58. if(mtx.a00!=1<<16||mtx.a11!=1<<16)
  59. {
  60. int bits=SWFCountSignedBits2(mtx.a00,mtx.a11);
  61. [fh writeBits:1 value:1];
  62. [fh writeBits:5 value:bits];
  63. [fh writeBits:bits value:mtx.a00];
  64. [fh writeBits:bits value:mtx.a11];
  65. }
  66. else [fh writeBits:1 value:0];
  67. if(mtx.a01!=0||mtx.a10!=0)
  68. {
  69. int bits=SWFCountSignedBits2(mtx.a01,mtx.a10);
  70. [fh writeBits:1 value:1];
  71. [fh writeBits:5 value:bits];
  72. [fh writeBits:bits value:mtx.a10];
  73. [fh writeBits:bits value:mtx.a01];
  74. }
  75. else [fh writeBits:1 value:0];
  76. int bits=SWFCountSignedBits2(mtx.a02,mtx.a12);
  77. [fh writeBits:5 value:bits];
  78. [fh writeBits:bits value:mtx.a02];
  79. [fh writeBits:bits value:mtx.a12];
  80. [fh flushWriteBits];
  81. }
  82. static inline int fixmult(int a,int b) { return (((int64_t)a)*((int64_t)b))/65536; }
  83. SWFMatrix SWFMultiplyMatrices(SWFMatrix a,SWFMatrix b)
  84. {
  85. return SWFMakeMatrix(
  86. fixmult(a.a00,b.a00)+fixmult(a.a01,b.a10),
  87. fixmult(a.a00,b.a01)+fixmult(a.a01,b.a11),
  88. fixmult(a.a00,b.a02)+fixmult(a.a01,b.a12)+a.a02,
  89. fixmult(a.a10,b.a00)+fixmult(a.a11,b.a10),
  90. fixmult(a.a10,b.a01)+fixmult(a.a11,b.a11),
  91. fixmult(a.a10,b.a02)+fixmult(a.a11,b.a12)+a.a12
  92. );
  93. }
  94. SWFMatrix SWFScalingMatrix(float x_scale,float y_scale)
  95. {
  96. return SWFMakeMatrix(
  97. 65536*x_scale,0,0,
  98. 0,65536*y_scale,0
  99. );
  100. }
  101. SWFMatrix SWFRotationMatrix(float degrees)
  102. {
  103. double rad=degrees*M_PI/180;
  104. return SWFMakeMatrix(
  105. 65536*cos(rad),-65536*sin(rad),0,
  106. 65536*sin(rad),65536*cos(rad),0
  107. );
  108. }
  109. /*SWFMatrix SWFMatrixFromAffineTransform(NSAffineTransform *t)
  110. {
  111. NSAffineTransformStruct a=[t transformStruct];
  112. SWFMatrix res={
  113. a.m11*65536.0,a.m21*65536.0,a.tX*20.0,
  114. a.m12*65536.0,a.m22*65536.0,a.tY*20.0
  115. };
  116. return res;
  117. }
  118. NSAffineTransform *SWFAffineTransformFromMatrix(SWFMatrix m)
  119. {
  120. NSAffineTransformStruct a={
  121. (float)m.a00/65536.0,(float)m.a10/65536.0,
  122. (float)m.a01/65536.0,(float)m.a11/65536.0,
  123. (float)m.a02/20.0,(float)m.a12/20.0
  124. }
  125. NSAffineTransform *t=[NSAffineTransform transform];
  126. [transform setTransformStruct:a];
  127. return t;
  128. }*/
  129. static inline int imax(int a,int b) { return a>b?a:b; }
  130. int SWFCountBits(uint32_t val)
  131. {
  132. int res=0;
  133. if(val==0) return 0;
  134. if(val&0xFFFF0000) { res|=16; val>>=16; }
  135. if(val&0x0000FF00) { res|=8; val>>=8; }
  136. if(val&0x000000F0) { res|=4; val>>=4; }
  137. if(val&0x0000000C) { res|=2; val>>=2; }
  138. if(val&0x00000002) { res|=1; }
  139. return res+1;
  140. }
  141. int SWFCountBits2(uint32_t val1,uint32_t val2)
  142. {
  143. return imax(SWFCountBits(val1),SWFCountBits(val2));
  144. }
  145. int SWFCountBits4(uint32_t val1,uint32_t val2,uint32_t val3,uint32_t val4)
  146. {
  147. return imax(SWFCountBits2(val1,val2),SWFCountBits2(val3,val4));
  148. }
  149. int SWFCountSignedBits(int32_t val)
  150. {
  151. if(val==0) return 0;
  152. else if(val<0) return SWFCountBits(~val)+1;
  153. else return SWFCountBits(val)+1;
  154. }
  155. int SWFCountSignedBits2(int32_t val1,int32_t val2)
  156. {
  157. return imax(SWFCountSignedBits(val1),SWFCountSignedBits(val2));
  158. }
  159. int SWFCountSignedBits4(int32_t val1,int32_t val2,int32_t val3,int32_t val4)
  160. {
  161. return imax(SWFCountSignedBits2(val1,val2),SWFCountSignedBits2(val3,val4));
  162. }