From 180926bbd13e0b464af60a72a99e4553f9291d63 Mon Sep 17 00:00:00 2001 From: Alfred Kayser Date: Fri, 24 Oct 2008 01:28:29 -0500 Subject: [PATCH] Bug 422637 - "Merge nsColorNames into nsColor to have less public functions and less code" [r=vlad sr=roc] --- gfx/public/nsColorNames.h | 27 -------- gfx/src/Makefile.in | 1 - gfx/src/nsColor.cpp | 58 +++++++++++++++- gfx/src/nsColorNames.cpp | 125 ----------------------------------- gfx/tests/DumpColors.cpp | 52 --------------- gfx/tests/Makefile.in | 1 - gfx/tests/TestColorNames.cpp | 71 +++++++++----------- 7 files changed, 88 insertions(+), 247 deletions(-) diff --git a/gfx/public/nsColorNames.h b/gfx/public/nsColorNames.h index 5fc11d7b5fd0..d5939ec37493 100644 --- a/gfx/public/nsColorNames.h +++ b/gfx/public/nsColorNames.h @@ -38,39 +38,12 @@ #ifndef nsColorNames_h___ #define nsColorNames_h___ -#include "nsColor.h" #include "gfxCore.h" -#include "nsStringFwd.h" - -/* - Declare the enum list using the magic of preprocessing - enum values are "eColorName_foo" (where foo is the color name) - - To change the list of colors, see nsColorNameList.h - - */ -#define GFX_COLOR(_name, _value) eColorName_##_name, -enum nsColorName { - eColorName_UNKNOWN = -1, -#include "nsColorNameList.h" - eColorName_COUNT -}; -#undef GFX_COLOR class NS_GFX nsColorNames { public: static void AddRefTable(void); static void ReleaseTable(void); - - // Given a color name, return the color enum value - // This only functions provided a valid ref on the table - static nsColorName LookupName(const nsAString& aName); - static nsColorName LookupName(const nsACString& aName); - - static const nsAFlatCString& GetStringValue(nsColorName aColorName); - - // Color id to rgb value table - static NS_GFX_STATIC_MEMBER_(const nscolor) kColors[]; }; #endif /* nsColorNames_h___ */ diff --git a/gfx/src/Makefile.in b/gfx/src/Makefile.in index bdfa5368e333..815f31c418e6 100644 --- a/gfx/src/Makefile.in +++ b/gfx/src/Makefile.in @@ -67,7 +67,6 @@ endif CPPSRCS = \ nsColor.cpp \ - nsColorNames.cpp \ nsDeviceContext.cpp \ nsFont.cpp \ nsRect.cpp \ diff --git a/gfx/src/nsColor.cpp b/gfx/src/nsColor.cpp index 1e3c08ee64dd..26ce8529908a 100644 --- a/gfx/src/nsColor.cpp +++ b/gfx/src/nsColor.cpp @@ -45,6 +45,56 @@ #include "nsIServiceManager.h" #include #include "prprf.h" +#include "nsStaticNameTable.h" + +// define an array of all color names +#define GFX_COLOR(_name, _value) #_name, +static const char* const kColorNames[] = { +#include "nsColorNameList.h" +}; +#undef GFX_COLOR + +// define an array of all color name values +#define GFX_COLOR(_name, _value) _value, +static const nscolor kColors[] = { +#include "nsColorNameList.h" +}; +#undef GFX_COLOR + +#define eColorName_COUNT (NS_ARRAY_LENGTH(kColorNames)) +#define eColorName_UNKNOWN (-1) + +static nsStaticCaseInsensitiveNameTable* gColorTable = nsnull; + +void nsColorNames::AddRefTable(void) +{ + NS_ASSERTION(!gColorTable, "pre existing array!"); + if (!gColorTable) { + gColorTable = new nsStaticCaseInsensitiveNameTable(); + if (gColorTable) { +#ifdef DEBUG + { + // let's verify the table... + for (PRInt32 index = 0; index < eColorName_COUNT; ++index) { + nsCAutoString temp1(kColorNames[index]); + nsCAutoString temp2(kColorNames[index]); + ToLowerCase(temp1); + NS_ASSERTION(temp1.Equals(temp2), "upper case char in table"); + } + } +#endif + gColorTable->Init(kColorNames, eColorName_COUNT); + } + } +} + +void nsColorNames::ReleaseTable(void) +{ + if (gColorTable) { + delete gColorTable; + gColorTable = nsnull; + } +} static int ComponentValue(const PRUnichar* aColorSpec, int aLen, int color, int dpc) { @@ -161,11 +211,13 @@ NS_GFX_(void) NS_RGBToHex(nscolor aColor, nsAString& aResult) NS_GFX_(PRBool) NS_ColorNameToRGB(const nsAString& aColorName, nscolor* aResult) { - nsColorName id = nsColorNames::LookupName(aColorName); + if (!gColorTable) return PR_FALSE; + + PRInt32 id = gColorTable->Lookup(aColorName); if (eColorName_UNKNOWN < id) { NS_ASSERTION(id < eColorName_COUNT, "LookupName mess up"); - if (nsnull != aResult) { - *aResult = nsColorNames::kColors[id]; + if (aResult) { + *aResult = kColors[id]; } return PR_TRUE; } diff --git a/gfx/src/nsColorNames.cpp b/gfx/src/nsColorNames.cpp index b12169b49599..e69de29bb2d1 100644 --- a/gfx/src/nsColorNames.cpp +++ b/gfx/src/nsColorNames.cpp @@ -1,125 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1999 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include "nsColorNames.h" -#include "nsString.h" -#include "nsStaticNameTable.h" -#include "nsReadableUtils.h" - -// define an array of all color names -#define GFX_COLOR(_name, _value) #_name, -const char* const kColorNames[] = { -#include "nsColorNameList.h" -}; -#undef GFX_COLOR - -// define an array of all color name values -#define GFX_COLOR(_name, _value) _value, -const nscolor nsColorNames::kColors[] = { -#include "nsColorNameList.h" -}; -#undef GFX_COLOR - -static PRInt32 gTableRefCount; -static nsStaticCaseInsensitiveNameTable* gColorTable; - -void -nsColorNames::AddRefTable(void) -{ - if (0 == gTableRefCount++) { - NS_ASSERTION(!gColorTable, "pre existing array!"); - gColorTable = new nsStaticCaseInsensitiveNameTable(); - if (gColorTable) { -#ifdef DEBUG - { - // let's verify the table... - for (PRInt32 index = 0; index < eColorName_COUNT; ++index) { - nsCAutoString temp1(kColorNames[index]); - nsCAutoString temp2(kColorNames[index]); - ToLowerCase(temp1); - NS_ASSERTION(temp1.Equals(temp2), "upper case char in table"); - } - } -#endif - gColorTable->Init(kColorNames, eColorName_COUNT); - } - } -} - -void -nsColorNames::ReleaseTable(void) -{ - if (0 == --gTableRefCount) { - if (gColorTable) { - delete gColorTable; - gColorTable = nsnull; - } - } -} - -nsColorName -nsColorNames::LookupName(const nsACString& aColor) -{ - NS_ASSERTION(gColorTable, "no lookup table, needs addref"); - if (gColorTable) { - return nsColorName(gColorTable->Lookup(aColor)); - } - return eColorName_UNKNOWN; -} - -nsColorName -nsColorNames::LookupName(const nsAString& aColor) -{ - NS_ASSERTION(gColorTable, "no lookup table, needs addref"); - if (gColorTable) { - return nsColorName(gColorTable->Lookup(aColor)); - } - return eColorName_UNKNOWN; -} - -const nsAFlatCString& -nsColorNames::GetStringValue(nsColorName aColor) -{ - NS_ASSERTION(gColorTable, "no lookup table, needs addref"); - if (gColorTable) { - return gColorTable->GetStringValue(PRInt32(aColor)); - } else { - static nsDependentCString kNullStr(""); - return kNullStr; - } -} - diff --git a/gfx/tests/DumpColors.cpp b/gfx/tests/DumpColors.cpp index 394c4c33bf3a..e69de29bb2d1 100644 --- a/gfx/tests/DumpColors.cpp +++ b/gfx/tests/DumpColors.cpp @@ -1,52 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: MPL 1.1/GPL 2.0/LGPL 2.1 - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * The Original Code is mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * Alternatively, the contents of this file may be used under the terms of - * either of the GNU General Public License Version 2 or later (the "GPL"), - * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), - * in which case the provisions of the GPL or the LGPL are applicable instead - * of those above. If you wish to allow use of your version of this file only - * under the terms of either the GPL or the LGPL, and not to allow others to - * use your version of this file under the terms of the MPL, indicate your - * decision by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL or the LGPL. If you do not delete - * the provisions above, a recipient may use your version of this file under - * the terms of any one of the MPL, the GPL or the LGPL. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include "nsColor.h" -#include "nsColorNames.h" -#include "nsString.h" - -int main(int argc, char** argv) -{ - for (int i = 0; i < eColorName_COUNT; i++) { - nscolor rgba = nsColorNames::kColors[i]; - printf("%s: NS_RGB(%d,%d,%d,%d)\n", - nsColorNames::GetStringValue(nsColorName(i)).get(), - NS_GET_R(rgba), NS_GET_G(rgba), NS_GET_B(rgba), NS_GET_A(rgba)); - } - return 0; -} diff --git a/gfx/tests/Makefile.in b/gfx/tests/Makefile.in index 479b04771dab..cacb33b46986 100644 --- a/gfx/tests/Makefile.in +++ b/gfx/tests/Makefile.in @@ -50,7 +50,6 @@ REQUIRES = xpcom \ $(NULL) CPPSRCS = \ - DumpColors.cpp \ TestColorNames.cpp \ TestRect.cpp \ $(NULL) diff --git a/gfx/tests/TestColorNames.cpp b/gfx/tests/TestColorNames.cpp index 0973c6ff8e5c..84c4be1673d5 100644 --- a/gfx/tests/TestColorNames.cpp +++ b/gfx/tests/TestColorNames.cpp @@ -39,10 +39,24 @@ #include #include -#include "nsColorNames.h" +#include "nsColor.h" #include "prprf.h" #include "nsString.h" +// define an array of all color names +#define GFX_COLOR(_name, _value) #_name, +static const char* const kColorNames[] = { +#include "nsColorNameList.h" +}; +#undef GFX_COLOR + +// define an array of all color name values +#define GFX_COLOR(_name, _value) _value, +static const nscolor kColors[] = { +#include "nsColorNameList.h" +}; +#undef GFX_COLOR + static const char* kJunkNames[] = { nsnull, "", @@ -54,8 +68,7 @@ static const char* kJunkNames[] = { int main(int argc, char** argv) { - nsColorName id; - nsColorName index; + nscolor rgb; int rv = 0; // Everything appears to assert if we don't do this first... @@ -65,49 +78,30 @@ int main(int argc, char** argv) // be in the table. Futz with the case to make sure any case will // work - index = eColorName_UNKNOWN; - while (PRInt32(index) < (PRInt32 (eColorName_COUNT) - 1)) { + for (int index = 0 ; index < NS_ARRAY_LENGTH(kColorNames); index++) { // Lookup color by name and make sure it has the right id - index = nsColorName(PRInt32(index) + 1); - nsCString tagName(nsColorNames::GetStringValue(index)); - if (tagName.IsEmpty()) { - printf("bug: tagName for nsColorNames::GetStringValue(%d) is ''\n", index); - rv = -1; - continue; - } + nsCString tagName(kColorNames[index]); - id = nsColorNames::LookupName(NS_ConvertASCIItoUTF16(tagName)); - if (id == eColorName_UNKNOWN) { + // Check that color lookup by name gets the right rgb value + if (!NS_ColorNameToRGB(NS_ConvertASCIItoUTF16(tagName), &rgb)) { printf("bug: can't find '%s'\n", tagName.get()); rv = -1; } - if (id != index) { - printf("bug: name='%s' id=%d index=%d\n", tagName.get(), id, index); + if (rgb != kColors[index]) { + printf("bug: name='%s' ColorNameToRGB=%x kColors[%d]=%08x\n", + tagName.get(), rgb, index, kColors[index]); rv = -1; } // fiddle with the case to make sure we can still find it tagName.SetCharAt(tagName.CharAt(0) - 32, 0); - id = nsColorNames::LookupName(NS_ConvertASCIItoUTF16(tagName)); - if (id == eColorName_UNKNOWN) { + if (!NS_ColorNameToRGB(NS_ConvertASCIItoUTF16(tagName), &rgb)) { printf("bug: can't find '%s'\n", tagName.get()); rv = -1; } - if (id != index) { - printf("bug: name='%s' id=%d index=%d\n", tagName.get(), id, index); - rv = -1; - } - - // Check that color lookup by name gets the right rgb value - nscolor rgb; - if (!NS_ColorNameToRGB(NS_ConvertASCIItoUTF16(tagName), &rgb)) { - printf("bug: name='%s' didn't NS_ColorNameToRGB\n", tagName.get()); - rv = -1; - } - if (nsColorNames::kColors[index] != rgb) { - printf("bug: name='%s' ColorNameToRGB=%x kColors[%d]=%x\n", - tagName.get(), rgb, nsColorNames::kColors[index], - nsColorNames::kColors[index]); + if (rgb != kColors[index]) { + printf("bug: name='%s' ColorNameToRGB=%x kColors[%d]=%08x\n", + tagName.get(), rgb, index, kColors[index]); rv = -1; } @@ -129,14 +123,15 @@ int main(int argc, char** argv) } // Now make sure we don't find some garbage - for (int i = 0; i < (int) (sizeof(kJunkNames) / sizeof(const char*)); i++) { - const char* tag = kJunkNames[i]; - id = nsColorNames::LookupName(NS_ConvertASCIItoUTF16(tag)); - if (id > eColorName_UNKNOWN) { - printf("bug: found '%s'\n", tag ? tag : "(null)"); + for (int i = 0; i < NS_ARRAY_LENGTH(kJunkNames); i++) { + nsCString tag(kJunkNames[i]); + if (NS_ColorNameToRGB(NS_ConvertASCIItoUTF16(tag), &rgb)) { + printf("bug: found '%s'\n", kJunkNames[i] ? kJunkNames[i] : "(null)"); rv = -1; } } + nsColorNames::ReleaseTable(); + return rv; }