504 }
505
506
507 // Named color lists --------------------------------------------------------------------------------------------
508
509 // Grow the list to keep at least NumElements
510 static
511 cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v)
512 {
513 cmsUInt32Number size;
514 _cmsNAMEDCOLOR * NewPtr;
515
516 if (v == NULL) return FALSE;
517
518 if (v ->Allocated == 0)
519 size = 64; // Initial guess
520 else
521 size = v ->Allocated * 2;
522
523 // Keep a maximum color lists can grow, 100K entries seems reasonable
524 if (size > 1024*100) return FALSE;
525
526 NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR));
527 if (NewPtr == NULL)
528 return FALSE;
529
530 v ->List = NewPtr;
531 v ->Allocated = size;
532 return TRUE;
533 }
534
535 // Allocate a list for n elements
536 cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix)
537 {
538 cmsNAMEDCOLORLIST* v = (cmsNAMEDCOLORLIST*) _cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST));
539
540 if (v == NULL) return NULL;
541
542 v ->List = NULL;
543 v ->nColors = 0;
544 v ->ContextID = ContextID;
545
546 while (v -> Allocated < n){
547 if (!GrowNamedColorList(v)) return NULL;
548 }
549
550 strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
551 strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
552 v->Prefix[32] = v->Suffix[32] = 0;
553
554 v -> ColorantCount = ColorantCount;
555
556 return v;
557 }
558
559 // Free a list
560 void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
561 {
562 if (v == NULL) return;
563 if (v ->List) _cmsFree(v ->ContextID, v ->List);
564 _cmsFree(v ->ContextID, v);
565 }
566
567 cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
|
504 }
505
506
507 // Named color lists --------------------------------------------------------------------------------------------
508
509 // Grow the list to keep at least NumElements
510 static
511 cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v)
512 {
513 cmsUInt32Number size;
514 _cmsNAMEDCOLOR * NewPtr;
515
516 if (v == NULL) return FALSE;
517
518 if (v ->Allocated == 0)
519 size = 64; // Initial guess
520 else
521 size = v ->Allocated * 2;
522
523 // Keep a maximum color lists can grow, 100K entries seems reasonable
524 if (size > 1024 * 100) {
525 _cmsFree(v->ContextID, (void*) v->List);
526 v->List = NULL;
527 return FALSE;
528 }
529
530 NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR));
531 if (NewPtr == NULL)
532 return FALSE;
533
534 v ->List = NewPtr;
535 v ->Allocated = size;
536 return TRUE;
537 }
538
539 // Allocate a list for n elements
540 cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix)
541 {
542 cmsNAMEDCOLORLIST* v = (cmsNAMEDCOLORLIST*) _cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST));
543
544 if (v == NULL) return NULL;
545
546 v ->List = NULL;
547 v ->nColors = 0;
548 v ->ContextID = ContextID;
549
550 while (v -> Allocated < n) {
551 if (!GrowNamedColorList(v)) {
552 _cmsFree(ContextID, (void*) v);
553 return NULL;
554 }
555 }
556
557 strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
558 strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
559 v->Prefix[32] = v->Suffix[32] = 0;
560
561 v -> ColorantCount = ColorantCount;
562
563 return v;
564 }
565
566 // Free a list
567 void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
568 {
569 if (v == NULL) return;
570 if (v ->List) _cmsFree(v ->ContextID, v ->List);
571 _cmsFree(v ->ContextID, v);
572 }
573
574 cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
|