<html>
    <head>
      <base href="https://bugs.freedesktop.org/" />
    </head>
    <body>
      <p>
        <div>
            <b><a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED --- - size specific design selection support in OS/2 table version 5"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=71287#c8">Comment # 8</a>
              on <a class="bz_bug_link 
          bz_status_ASSIGNED "
   title="ASSIGNED --- - size specific design selection support in OS/2 table version 5"
   href="https://bugs.freedesktop.org/show_bug.cgi?id=71287">bug 71287</a>
              from <span class="vcard"><a class="email" href="mailto:freedesktop@behdad.org" title="Behdad Esfahbod <freedesktop@behdad.org>"> <span class="fn">Behdad Esfahbod</span></a>
</span></b>
        <pre>+ lower_size = os2->usLowerOpticalPointSize / 20;
+ upper_size = os2->usUpperOpticalPointSize / 20;

Float division instead?


+ if (os2)
+ {
+ r = FcRangeCreateDouble (lower_size, upper_size);
+ if (!FcPatternAddRange (pat, FC_SIZE, r))

If the range is not available (either old os2 or that the range is
all-inclusive), then, NOT set size?  That would preserve most
backward-compatibility.


+ if (FcRangeIsInRange (r1, r2))
+ ret = 0.0;
+ else
+ ret = fabs (r1->u.d.end - r2->u.d.end);

This sounds wrong.  If not in-range, then we want min((r1.end - r2.start),
abs(r1.start - r2.end)).  No?


+FcRange *
+FcRangeEvaluate (FcOp op, const FcRange *left, const FcRange *right)
+{
+ FcRange *ret = NULL;
+ FcRange cl = FcRangeCanonicalize (left), cr = FcRangeCanonicalize (right);
+
+ switch ((int) op) {
+ case FcOpOr:
+ ret = FcRangeCreateDouble (FC_MIN (cl.u.d.begin, cr.u.d.begin),
+ FC_MAX (cl.u.d.end, cr.u.d.end));
+ break;
+ case FcOpAnd:
+ ret = FcRangeCreateDouble (FC_MAX (cl.u.d.begin, cr.u.d.begin),
+ FC_MIN (cl.u.d.end, cr.u.d.end));
+ break;
+ case FcOpPlus:
+ ret = FcRangeCreateDouble (cl.u.d.begin + cr.u.d.begin,
+ cl.u.d.end + cr.u.d.end);
+ break;
+ case FcOpMinus:
+ ret = FcRangeCreateDouble (cl.u.d.begin - cr.u.d.begin,
+ cl.u.d.end - cr.u.d.end);
+ break;
+ case FcOpTimes:
+ ret = FcRangeCreateDouble (cl.u.d.begin * cr.u.d.begin,
+ cl.u.d.end * cr.u.d.end);
+ break;
+ case FcOpDivide:
+ ret = FcRangeCreateDouble (cl.u.d.begin / cr.u.d.begin,
+ cl.u.d.end / cr.u.d.end);
+ break;

These don't make much sense.  I suppose we can initially not implement any of
these, and add as we need them.


I haven't done any testing or a full close review.  It's a bit unsettling how
much boilerplate changes we need for this.  But, again, thanks for working on
this.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>