| OLD | NEW |
| 1 //------------------------------------------------------------------------------
--- | 1 //------------------------------------------------------------------------------
--- |
| 2 // | 2 // |
| 3 // Little Color Management System | 3 // Little Color Management System |
| 4 // Copyright (c) 1998-2012 Marti Maria Saguer | 4 // Copyright (c) 1998-2012 Marti Maria Saguer |
| 5 // | 5 // |
| 6 // Permission is hereby granted, free of charge, to any person obtaining | 6 // Permission is hereby granted, free of charge, to any person obtaining |
| 7 // a copy of this software and associated documentation files (the "Software"), | 7 // a copy of this software and associated documentation files (the "Software"), |
| 8 // to deal in the Software without restriction, including without limitation | 8 // to deal in the Software without restriction, including without limitation |
| 9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, | 9 // the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| 10 // and/or sell copies of the Software, and to permit persons to whom the Softwar
e | 10 // and/or sell copies of the Software, and to permit persons to whom the Softwar
e |
| (...skipping 1237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 NewMPE ->Data = NULL; | 1248 NewMPE ->Data = NULL; |
| 1249 } | 1249 } |
| 1250 | 1250 |
| 1251 return NewMPE; | 1251 return NewMPE; |
| 1252 } | 1252 } |
| 1253 | 1253 |
| 1254 | 1254 |
| 1255 // *****************************************************************************
****************************** | 1255 // *****************************************************************************
****************************** |
| 1256 | 1256 |
| 1257 // This function sets up the channel count | 1257 // This function sets up the channel count |
| 1258 | |
| 1259 static | 1258 static |
| 1260 void BlessLUT(cmsPipeline* lut) | 1259 cmsBool BlessLUT(cmsPipeline* lut) |
| 1261 { | 1260 { |
| 1262 // We can set the input/ouput channels only if we have elements. | 1261 // We can set the input/ouput channels only if we have elements. |
| 1263 if (lut ->Elements != NULL) { | 1262 if (lut ->Elements != NULL) { |
| 1264 | 1263 |
| 1265 cmsStage *First, *Last; | 1264 cmsStage* prev; |
| 1265 cmsStage* next; |
| 1266 cmsStage* First; |
| 1267 cmsStage* Last; |
| 1266 | 1268 |
| 1267 First = cmsPipelineGetPtrToFirstStage(lut); | 1269 First = cmsPipelineGetPtrToFirstStage(lut); |
| 1268 Last = cmsPipelineGetPtrToLastStage(lut); | 1270 Last = cmsPipelineGetPtrToLastStage(lut); |
| 1269 | 1271 |
| 1270 if (First != NULL)lut ->InputChannels = First ->InputChannels; | 1272 if (First == NULL || Last == NULL) return FALSE; |
| 1271 if (Last != NULL) lut ->OutputChannels = Last ->OutputChannels; | 1273 |
| 1274 lut->InputChannels = First->InputChannels; |
| 1275 lut->OutputChannels = Last->OutputChannels; |
| 1276 |
| 1277 // Check chain consistency |
| 1278 prev = First; |
| 1279 next = prev->Next; |
| 1280 |
| 1281 while (next != NULL) |
| 1282 { |
| 1283 if (next->InputChannels != prev->OutputChannels) |
| 1284 return FALSE; |
| 1285 |
| 1286 next = next->Next; |
| 1287 prev = prev->Next; |
| 1288 } |
| 1272 } | 1289 } |
| 1290 return TRUE; |
| 1273 } | 1291 } |
| 1274 | 1292 |
| 1275 | 1293 |
| 1276 // Default to evaluate the LUT on 16 bit-basis. Precision is retained. | 1294 // Default to evaluate the LUT on 16 bit-basis. Precision is retained. |
| 1277 static | 1295 static |
| 1278 void _LUTeval16(register const cmsUInt16Number In[], register cmsUInt16Number Ou
t[], register const void* D) | 1296 void _LUTeval16(register const cmsUInt16Number In[], register cmsUInt16Number Ou
t[], register const void* D) |
| 1279 { | 1297 { |
| 1280 cmsPipeline* lut = (cmsPipeline*) D; | 1298 cmsPipeline* lut = (cmsPipeline*) D; |
| 1281 cmsStage *mpe; | 1299 cmsStage *mpe; |
| 1282 cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS] = {0.0f}; | 1300 cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS] = {0.0f}; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 | 1342 |
| 1325 | 1343 |
| 1326 | 1344 |
| 1327 | 1345 |
| 1328 // LUT Creation & Destruction | 1346 // LUT Creation & Destruction |
| 1329 | 1347 |
| 1330 cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In
putChannels, cmsUInt32Number OutputChannels) | 1348 cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number In
putChannels, cmsUInt32Number OutputChannels) |
| 1331 { | 1349 { |
| 1332 cmsPipeline* NewLUT; | 1350 cmsPipeline* NewLUT; |
| 1333 | 1351 |
| 1352 // A value of zero in channels is allowed as placeholder |
| 1334 if (InputChannels >= cmsMAXCHANNELS || | 1353 if (InputChannels >= cmsMAXCHANNELS || |
| 1335 OutputChannels >= cmsMAXCHANNELS) return NULL; | 1354 OutputChannels >= cmsMAXCHANNELS) return NULL; |
| 1336 | 1355 |
| 1337 NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline)); | 1356 NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline)); |
| 1338 if (NewLUT == NULL) return NULL; | 1357 if (NewLUT == NULL) return NULL; |
| 1339 | 1358 |
| 1340 | 1359 |
| 1341 NewLUT -> InputChannels = InputChannels; | 1360 NewLUT -> InputChannels = InputChannels; |
| 1342 NewLUT -> OutputChannels = OutputChannels; | 1361 NewLUT -> OutputChannels = OutputChannels; |
| 1343 | 1362 |
| 1344 NewLUT ->Eval16Fn = _LUTeval16; | 1363 NewLUT ->Eval16Fn = _LUTeval16; |
| 1345 NewLUT ->EvalFloatFn = _LUTevalFloat; | 1364 NewLUT ->EvalFloatFn = _LUTevalFloat; |
| 1346 NewLUT ->DupDataFn = NULL; | 1365 NewLUT ->DupDataFn = NULL; |
| 1347 NewLUT ->FreeDataFn = NULL; | 1366 NewLUT ->FreeDataFn = NULL; |
| 1348 NewLUT ->Data = NewLUT; | 1367 NewLUT ->Data = NewLUT; |
| 1349 NewLUT ->ContextID = ContextID; | 1368 NewLUT ->ContextID = ContextID; |
| 1350 | 1369 |
| 1351 BlessLUT(NewLUT); | 1370 if (!BlessLUT(NewLUT)) |
| 1371 { |
| 1372 _cmsFree(ContextID, NewLUT); |
| 1373 return NULL; |
| 1374 } |
| 1352 | 1375 |
| 1353 return NewLUT; | 1376 return NewLUT; |
| 1354 } | 1377 } |
| 1355 | 1378 |
| 1356 cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut) | 1379 cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut) |
| 1357 { | 1380 { |
| 1358 _cmsAssert(lut != NULL); | 1381 _cmsAssert(lut != NULL); |
| 1359 return lut ->ContextID; | 1382 return lut ->ContextID; |
| 1360 } | 1383 } |
| 1361 | 1384 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1447 NewLUT ->EvalFloatFn = lut ->EvalFloatFn; | 1470 NewLUT ->EvalFloatFn = lut ->EvalFloatFn; |
| 1448 NewLUT ->DupDataFn = lut ->DupDataFn; | 1471 NewLUT ->DupDataFn = lut ->DupDataFn; |
| 1449 NewLUT ->FreeDataFn = lut ->FreeDataFn; | 1472 NewLUT ->FreeDataFn = lut ->FreeDataFn; |
| 1450 | 1473 |
| 1451 if (NewLUT ->DupDataFn != NULL) | 1474 if (NewLUT ->DupDataFn != NULL) |
| 1452 NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data); | 1475 NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data); |
| 1453 | 1476 |
| 1454 | 1477 |
| 1455 NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits; | 1478 NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits; |
| 1456 | 1479 |
| 1457 BlessLUT(NewLUT); | 1480 if (!BlessLUT(NewLUT)) |
| 1481 { |
| 1482 _cmsFree(lut->ContextID, NewLUT); |
| 1483 return NULL; |
| 1484 } |
| 1485 |
| 1458 return NewLUT; | 1486 return NewLUT; |
| 1459 } | 1487 } |
| 1460 | 1488 |
| 1461 | 1489 |
| 1462 int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage
* mpe) | 1490 int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage
* mpe) |
| 1463 { | 1491 { |
| 1464 cmsStage* Anterior = NULL, *pt; | 1492 cmsStage* Anterior = NULL, *pt; |
| 1465 | 1493 |
| 1466 if (lut == NULL || mpe == NULL) | 1494 if (lut == NULL || mpe == NULL) |
| 1467 return FALSE; | 1495 return FALSE; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1484 pt = pt -> Next) Anterior = pt; | 1512 pt = pt -> Next) Anterior = pt; |
| 1485 | 1513 |
| 1486 Anterior ->Next = mpe; | 1514 Anterior ->Next = mpe; |
| 1487 mpe ->Next = NULL; | 1515 mpe ->Next = NULL; |
| 1488 } | 1516 } |
| 1489 break; | 1517 break; |
| 1490 default:; | 1518 default:; |
| 1491 return FALSE; | 1519 return FALSE; |
| 1492 } | 1520 } |
| 1493 | 1521 |
| 1494 BlessLUT(lut); | 1522 return BlessLUT(lut); |
| 1495 return TRUE; | |
| 1496 } | 1523 } |
| 1497 | 1524 |
| 1498 // Unlink an element and return the pointer to it | 1525 // Unlink an element and return the pointer to it |
| 1499 void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag
e** mpe) | 1526 void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStag
e** mpe) |
| 1500 { | 1527 { |
| 1501 cmsStage *Anterior, *pt, *Last; | 1528 cmsStage *Anterior, *pt, *Last; |
| 1502 cmsStage *Unlinked = NULL; | 1529 cmsStage *Unlinked = NULL; |
| 1503 | 1530 |
| 1504 | 1531 |
| 1505 // If empty LUT, there is nothing to remove | 1532 // If empty LUT, there is nothing to remove |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1540 lut ->Elements = NULL; | 1567 lut ->Elements = NULL; |
| 1541 break; | 1568 break; |
| 1542 default:; | 1569 default:; |
| 1543 } | 1570 } |
| 1544 | 1571 |
| 1545 if (mpe) | 1572 if (mpe) |
| 1546 *mpe = Unlinked; | 1573 *mpe = Unlinked; |
| 1547 else | 1574 else |
| 1548 cmsStageFree(Unlinked); | 1575 cmsStageFree(Unlinked); |
| 1549 | 1576 |
| 1577 // May fail, but we ignore it |
| 1550 BlessLUT(lut); | 1578 BlessLUT(lut); |
| 1551 } | 1579 } |
| 1552 | 1580 |
| 1553 | 1581 |
| 1554 // Concatenate two LUT into a new single one | 1582 // Concatenate two LUT into a new single one |
| 1555 cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2) | 1583 cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2) |
| 1556 { | 1584 { |
| 1557 cmsStage* mpe; | 1585 cmsStage* mpe; |
| 1558 | 1586 |
| 1559 // If both LUTS does not have elements, we need to inherit | 1587 // If both LUTS does not have elements, we need to inherit |
| 1560 // the number of channels | 1588 // the number of channels |
| 1561 if (l1 ->Elements == NULL && l2 ->Elements == NULL) { | 1589 if (l1 ->Elements == NULL && l2 ->Elements == NULL) { |
| 1562 l1 ->InputChannels = l2 ->InputChannels; | 1590 l1 ->InputChannels = l2 ->InputChannels; |
| 1563 l1 ->OutputChannels = l2 ->OutputChannels; | 1591 l1 ->OutputChannels = l2 ->OutputChannels; |
| 1564 } | 1592 } |
| 1565 | 1593 |
| 1566 // Cat second | 1594 // Cat second |
| 1567 for (mpe = l2 ->Elements; | 1595 for (mpe = l2 ->Elements; |
| 1568 mpe != NULL; | 1596 mpe != NULL; |
| 1569 mpe = mpe ->Next) { | 1597 mpe = mpe ->Next) { |
| 1570 | 1598 |
| 1571 // We have to dup each element | 1599 // We have to dup each element |
| 1572 if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe))) | 1600 if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe))) |
| 1573 return FALSE; | 1601 return FALSE; |
| 1574 } | 1602 } |
| 1575 | 1603 |
| 1576 BlessLUT(l1); | 1604 return BlessLUT(l1); |
| 1577 return TRUE; | |
| 1578 } | 1605 } |
| 1579 | 1606 |
| 1580 | 1607 |
| 1581 cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On) | 1608 cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On) |
| 1582 { | 1609 { |
| 1583 cmsBool Anterior = lut ->SaveAs8Bits; | 1610 cmsBool Anterior = lut ->SaveAs8Bits; |
| 1584 | 1611 |
| 1585 lut ->SaveAs8Bits = On; | 1612 lut ->SaveAs8Bits = On; |
| 1586 return Anterior; | 1613 return Anterior; |
| 1587 } | 1614 } |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1784 // Some clipping.... | 1811 // Some clipping.... |
| 1785 for (j=0; j < 3; j++) { | 1812 for (j=0; j < 3; j++) { |
| 1786 if (x[j] < 0) x[j] = 0; | 1813 if (x[j] < 0) x[j] = 0; |
| 1787 else | 1814 else |
| 1788 if (x[j] > 1.0) x[j] = 1.0; | 1815 if (x[j] > 1.0) x[j] = 1.0; |
| 1789 } | 1816 } |
| 1790 } | 1817 } |
| 1791 | 1818 |
| 1792 return TRUE; | 1819 return TRUE; |
| 1793 } | 1820 } |
| OLD | NEW |