Unified · Split
| @@ -264,6 +264,7 @@ read_ComponentGlyph(Otf *o, ComponentGlyph **out, int instr) · 263 unmodified lines | ||
| 264 | 264 | { |
| 265 | 265 | ComponentGlyph *v; |
| 266 | 266 | u8int *b; |
| 267 | + s16int f; | |
| 267 | 268 | |
| 268 | 269 | if((v = calloc(1, sizeof(*v))) == nil){ |
| 269 | 270 | nomem: |
| @@ -296,16 +297,17 @@ nomem: · 26 unmodified lines | ||
| 296 | 297 | } |
| 297 | 298 | if(b == nil) |
| 298 | 299 | goto err; |
| 300 | + #define f2dot14(o) (f = b[2*o]<<8 | b[2*o+1], (f>>14)+(f&((1<<14)-1))/16384.0) | |
| 299 | 301 | if((v->flags & CGLYPH_FL_SCALE) != 0 && (b = otfreadn(o, 2)) != nil){ |
| 300 | − v->scale = (b[0]<<8 | b[1]>>14)+(b[0]<<8 | b[1]&((1<<14)-1))/16384.0; | |
| 302 | + v->scale = f2dot14(0); | |
| 301 | 303 | }else if((v->flags & CGLYPH_FL_SCALE_XY) != 0 && (b = otfreadn(o, 2*2)) != nil){ |
| 302 | − v->scaleX = (b[0]<<8 | b[1]>>14)+(b[0]<<8 | b[1]&((1<<14)-1))/16384.0; | |
| 303 | − v->scaleY = (b[2]<<8 | b[3]>>14)+(b[2]<<8 | b[3]&((1<<14)-1))/16384.0; | |
| 304 | + v->scaleX = f2dot14(0); | |
| 305 | + v->scaleY = f2dot14(1); | |
| 304 | 306 | }else if((v->flags & CGLYPH_FL_2X2_TRANSFORM) != 0 && (b = otfreadn(o, 2*2*2)) != nil){ |
| 305 | − v->scaleX = (b[0]<<8 | b[1]>>14)+(b[0]<<8 | b[1]&((1<<14)-1))/16384.0; | |
| 306 | − v->scale01 = (b[2]<<8 | b[3]>>14)+(b[2]<<8 | b[3]&((1<<14)-1))/16384.0; | |
| 307 | − v->scale10 = (b[4]<<8 | b[5]>>14)+(b[4]<<8 | b[5]&((1<<14)-1))/16384.0; | |
| 308 | − v->scaleY = (b[6]<<8 | b[7]>>14)+(b[6]<<8 | b[7]&((1<<14)-1))/16384.0; | |
| 307 | + v->scaleX = f2dot14(0); | |
| 308 | + v->scale01 = f2dot14(1); | |
| 309 | + v->scale10 = f2dot14(2); | |
| 310 | + v->scaleY = f2dot14(3); | |
| 309 | 311 | } |
| 310 | 312 | if(b == nil) |
| 311 | 313 | goto err; |
| @@ -278,6 +278,7 @@ read_ComponentGlyph(Otf *o, ComponentGlyph **out, int instr) · 277 unmodified lines | ||
| 278 | 278 | { |
| 279 | 279 | ComponentGlyph *v; |
| 280 | 280 | u8int *b; |
| 281 | + s16int f; | |
| 281 | 282 | |
| 282 | 283 | if((v = calloc(1, sizeof(*v))) == nil){ |
| 283 | 284 | nomem: |
| @@ -310,16 +311,17 @@ nomem: · 26 unmodified lines | ||
| 310 | 311 | } |
| 311 | 312 | if(b == nil) |
| 312 | 313 | goto err; |
| 314 | + #define f2dot14(o) (f = b[2*o]<<8 | b[2*o+1], (f>>14)+(f&((1<<14)-1))/16384.0) | |
| 313 | 315 | if((v->flags & CGLYPH_FL_SCALE) != 0 && (b = otfreadn(o, 2)) != nil){ |
| 314 | − v->scale = (b[0]<<8 | b[1]>>14)+(b[0]<<8 | b[1]&((1<<14)-1))/16384.0; | |
| 316 | + v->scale = f2dot14(0); | |
| 315 | 317 | }else if((v->flags & CGLYPH_FL_SCALE_XY) != 0 && (b = otfreadn(o, 2*2)) != nil){ |
| 316 | − v->scaleX = (b[0]<<8 | b[1]>>14)+(b[0]<<8 | b[1]&((1<<14)-1))/16384.0; | |
| 317 | − v->scaleY = (b[2]<<8 | b[3]>>14)+(b[2]<<8 | b[3]&((1<<14)-1))/16384.0; | |
| 318 | + v->scaleX = f2dot14(0); | |
| 319 | + v->scaleY = f2dot14(1); | |
| 318 | 320 | }else if((v->flags & CGLYPH_FL_2X2_TRANSFORM) != 0 && (b = otfreadn(o, 2*2*2)) != nil){ |
| 319 | − v->scaleX = (b[0]<<8 | b[1]>>14)+(b[0]<<8 | b[1]&((1<<14)-1))/16384.0; | |
| 320 | − v->scale01 = (b[2]<<8 | b[3]>>14)+(b[2]<<8 | b[3]&((1<<14)-1))/16384.0; | |
| 321 | − v->scale10 = (b[4]<<8 | b[5]>>14)+(b[4]<<8 | b[5]&((1<<14)-1))/16384.0; | |
| 322 | − v->scaleY = (b[6]<<8 | b[7]>>14)+(b[6]<<8 | b[7]&((1<<14)-1))/16384.0; | |
| 321 | + v->scaleX = f2dot14(0); | |
| 322 | + v->scale01 = f2dot14(1); | |
| 323 | + v->scale10 = f2dot14(2); | |
| 324 | + v->scaleY = f2dot14(3); | |
| 323 | 325 | } |
| 324 | 326 | if(b == nil) |
| 325 | 327 | goto err; |