long babl_process (const Babl *cbabl, const void *source, void *destination, long n) { Babl *babl = (Babl*)cbabl; babl_assert (babl); babl_assert (source); babl_assert (destination); babl_assert (BABL_IS_BABL (babl)); if (n == 0) return 0; babl_assert (n > 0); /* first check if it is a fish since that is our fast path */ if (babl->class_type >= BABL_FISH && babl->class_type <= BABL_FISH_PATH) { babl->fish.processings++; babl->fish.pixels += babl_fish_process (babl, source, destination, n); return n; } /* matches all conversion classes */ if (babl->class_type >= BABL_CONVERSION && babl->class_type <= BABL_CONVERSION_PLANAR) return babl_conversion_process (babl, source, destination, n); babl_fatal ("eek"); return -1; }
static long babl_fish_process (Babl *babl, const void *source, void *destination, long n) { long ret = 0; switch (babl->class_type) { case BABL_FISH_REFERENCE: if (babl->fish.source == babl->fish.destination) { /* XXX: we're assuming linear buffers */ memcpy (destination, source, n * babl->fish.source->format.bytes_per_pixel); ret = n; } else { ret = babl_fish_reference_process (babl, source, destination, n); } break; case BABL_FISH_SIMPLE: if (BABL (babl->fish_simple.conversion)->class_type == BABL_CONVERSION_LINEAR) { ret = babl_conversion_process (BABL (babl->fish_simple.conversion), source, destination, n); } else { babl_fatal ("Cannot use a simple fish to process without a linear conversion"); } break; case BABL_FISH_PATH: ret = babl_fish_path_process (babl, source, destination, n); break; default: babl_log ("NYI"); ret = -1; break; } return ret; }
static int table_destination_each (Babl *babl, void *userdata) { Babl *source = userdata; Babl *destination = babl; qux++; if (qux % babl_formats_count () == qux / babl_formats_count ()) fprintf (output_file, "<td class='cell'> </td>"); else { const Babl *fish = babl_fish (source, destination); babl_assert (fish); switch (fish->class_type) { case BABL_FISH_PATH: fprintf (output_file, "<td class='cell'%s><a href='javascript:o()'>%s", fish->fish.pixels / sum_pixels > LIMIT ? " style='background-color: #69f'" : "", utf8_bar[babl_list_size (fish->fish_path.conversion_list)]); { int i; fprintf (output_file, "<div class='tooltip'>"); fprintf (output_file, "<h3><span class='g'>path</span> %s <span class='g'>to</span> %s</h3>", source->instance.name, destination->instance.name); if (fish->fish.processings > 0) { fprintf (output_file, "<span class='g'>Processings:</span>%i<br/>", fish->fish.processings); fprintf (output_file, "<span class='g'>Pixels:</span>%li<br/>", fish->fish.pixels); } fprintf (output_file, "<table>\n"); fprintf (output_file, "<tr>"); fprintf (output_file, "<td><em>conversion</em></td>"); fprintf (output_file, "<td style='text-align:right'><em>cost</em></td>"); fprintf (output_file, "<td style='text-align:right'><em>error</em></td>"); fprintf (output_file, "</tr>"); for (i = 0; i < babl_list_size (fish->fish_path.conversion_list); i++) { fprintf (output_file, "<tr>"); fprintf (output_file, "<td>%s</td>", BABL (fish->fish_path.conversion_list->items[i])->instance.name); fprintf (output_file, "<td class='r'>%li</td>", babl_conversion_cost (&BABL (fish->fish_path.conversion_list->items[i])->conversion)); fprintf (output_file, "<td class='r'>%e</td>", babl_conversion_error (&BABL (fish->fish_path.conversion_list->items[i])->conversion)); fprintf (output_file, "</tr>"); } fprintf (output_file, "<tr>"); fprintf (output_file, "<td><em>total</em></td>"); fprintf (output_file, "<td class='r'><em>%3.0f</em></td>", fish->fish_path.cost); fprintf (output_file, "<td class='r'><em>%e</em></td>", fish->fish.error); fprintf (output_file, "</tr>"); fprintf (output_file, "</table>"); fprintf (output_file, "</div>"); } fprintf (output_file, "</a></td>\n"); break; case BABL_FISH_REFERENCE: fprintf (output_file, "<td class='cell'%s><a href='javascript:o()'> ", fish->fish.pixels / sum_pixels > LIMIT ? " style='background-color: #f99'" : ""); fprintf (output_file, "<div class='tooltip'>"); fprintf (output_file, "<h3><span class='g'>Reference</span> %s <span class='g'>to</span> %s</h3>", source->instance.name, destination->instance.name); if (fish->fish.processings > 1) { fprintf (output_file, "<span class='g'>Processings:</span>%i<br/>", fish->fish.processings); fprintf (output_file, "<span class='g'>Pixels:</span>%li<br/>", fish->fish.pixels); } fprintf (output_file, "</div>"); fprintf (output_file, "</a></td>\n"); break; case BABL_FISH_SIMPLE: fprintf (output_file, "<td class='cell'%s><a href='javascript:o()'>·", fish->fish.pixels / sum_pixels > LIMIT ? " style='background-color: #69f'" : ""); fprintf (output_file, "<div class='tooltip'>"); fprintf (output_file, "<h3><span class='g'>Simple</span> %s <span class='g'>to</span> %s</h3>", source->instance.name, destination->instance.name); fprintf (output_file, "%s<br/>", BABL (fish->fish_simple.conversion)->instance.name); fprintf (output_file, "<span class='g'>cost:</span> %li<br/>", babl_conversion_cost ((fish->fish_simple.conversion))); fprintf (output_file, "<span class='g'>error:</span> %e<br/>", babl_conversion_error ((fish->fish_simple.conversion))); if (fish->fish.processings > 0) { fprintf (output_file, "<span class='g'>Processings:</span>%i<br/>", fish->fish.processings); fprintf (output_file, "<span class='g'>Pixels:</span>%li<br/>", fish->fish.pixels); } fprintf (output_file, "</div>"); fprintf (output_file, "</a></td>\n"); break; default: babl_fatal ("Unknown fish type"); break; } } return 0; }