Bug 422637 - "Merge nsColorNames into nsColor to have less public functions and less code" [r=vlad sr=roc]
authorAlfred Kayser <alfredkayser@gmail.com>
Fri, 24 Oct 2008 01:28:29 -0500
changeset 20804 003a5a6570af1a3fc6e9c0973839240dbfe62942
parent 20803 135a2999f0dc362195d81e757eee865a73dca5f7
child 20805 020514434957cb690ed49e1d19b60fbcf2cd0aa3
push idunknown
push userunknown
push dateunknown
reviewersvlad, roc
bugs422637
milestone1.9.1b2pre
Bug 422637 - "Merge nsColorNames into nsColor to have less public functions and less code" [r=vlad sr=roc]
gfx/public/nsColorNames.h
gfx/src/Makefile.in
gfx/src/nsColor.cpp
gfx/src/nsColorNames.cpp
gfx/tests/DumpColors.cpp
gfx/tests/Makefile.in
gfx/tests/TestColorNames.cpp
--- a/gfx/public/nsColorNames.h
+++ b/gfx/public/nsColorNames.h
@@ -33,44 +33,17 @@
  * 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 ***** */
 
 #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___ */
--- a/gfx/src/Makefile.in
+++ b/gfx/src/Makefile.in
@@ -62,17 +62,16 @@ REQUIRES	= xpcom \
 DIRS        = shared thebes
 
 ifdef MOZ_ENABLE_POSTSCRIPT
 DIRS        += psshared
 endif
 
 CPPSRCS = \
         nsColor.cpp \
-        nsColorNames.cpp \
         nsDeviceContext.cpp \
         nsFont.cpp \
         nsRect.cpp \
         nsRegion.cpp \
         nsTransform2D.cpp \
         nsScriptableRegion.cpp \
         $(NULL)
 
--- a/gfx/src/nsColor.cpp
+++ b/gfx/src/nsColor.cpp
@@ -40,16 +40,66 @@
 #include "nsColorNames.h"
 #include "nsString.h"
 #include "nscore.h"
 #include "nsCoord.h"
 #include "nsCOMPtr.h"
 #include "nsIServiceManager.h"
 #include <math.h>
 #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)
 {
   int component = 0;
   int index = (color * dpc);
   if (2 < dpc) {
     dpc = 2;
   }
@@ -156,21 +206,23 @@ NS_GFX_(void) NS_RGBToHex(nscolor aColor
   char buf[10];
   PR_snprintf(buf, sizeof(buf), "#%02x%02x%02x",
               NS_GET_R(aColor), NS_GET_G(aColor), NS_GET_B(aColor));
   CopyASCIItoUTF16(buf, 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;
   }
   return PR_FALSE;
 }
 
 NS_GFX_(nscolor)
 NS_ComposeColors(nscolor aBG, nscolor aFG)
--- 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;
-  }
-}
-
--- 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 <stdio.h>
-#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;
-}
--- a/gfx/tests/Makefile.in
+++ b/gfx/tests/Makefile.in
@@ -45,17 +45,16 @@ include $(DEPTH)/config/autoconf.mk
 MOZILLA_INTERNAL_API = 1
 
 REQUIRES	= xpcom \
 		  string \
 		  gfx \
 		  $(NULL)
 
 CPPSRCS		= \
-		DumpColors.cpp \
 		TestColorNames.cpp \
 		TestRect.cpp \
 		$(NULL)
 
 SIMPLE_PROGRAMS	= $(CPPSRCS:.cpp=$(BIN_SUFFIX))
 
 LIBS		= \
 		$(call EXPAND_LIBNAME_PATH,gkgfx,../src) \
--- a/gfx/tests/TestColorNames.cpp
+++ b/gfx/tests/TestColorNames.cpp
@@ -34,85 +34,79 @@
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 // No output means test passed.
 
 #include <stdio.h>
 #include <string.h>
-#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,
   "",
   "123",
   "backgroundz",
   "zzzzzz",
   "#@$&@#*@*$@$#"
 };
 
 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...
   nsColorNames::AddRefTable();
 
   // First make sure we can find all of the tags that are supposed to
   // 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;
     }
 
     // Check that parsing an RGB value in hex gets the right values
     PRUint8 r = NS_GET_R(rgb);
     PRUint8 g = NS_GET_G(rgb);
     PRUint8 b = NS_GET_B(rgb);
     char cbuf[50];
@@ -124,19 +118,20 @@ int main(int argc, char** argv)
     }
     if (hexrgb != rgb) {
       printf("bug: rgb=%x hexrgb=%x\n", rgb, hexrgb);
       rv = -1;
     }
   }
 
   // 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;
 }