Fix hinting and add subpixel to SampleApp.

This change allows users of SampleApp to cycle through all of the hinting modes
(using the 'h' key) and also toggle subpixel positioning on the paint (using
the 's' key). Because 'up' and 'down' have replaced its functionality,
'scale', the exising user of 's', is removed.


git-svn-id: http://skia.googlecode.com/svn/trunk@9421 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index c5910ef..e0a9ce4 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -463,11 +463,25 @@
 
 #include "SkDrawFilter.h"
 
+struct HintingState {
+    SkPaint::Hinting hinting;
+    const char* name;
+    const char* label;
+};
+static HintingState gHintingStates[] = {
+    {SkPaint::kNo_Hinting, "Mixed", NULL },
+    {SkPaint::kNo_Hinting, "None", "H0 " },
+    {SkPaint::kSlight_Hinting, "Slight", "Hs " },
+    {SkPaint::kNormal_Hinting, "Normal", "Hn " },
+    {SkPaint::kFull_Hinting, "Full", "Hf " },
+};
+
 class FlagsDrawFilter : public SkDrawFilter {
 public:
     FlagsDrawFilter(SkOSMenu::TriState lcd, SkOSMenu::TriState aa, SkOSMenu::TriState filter,
-                    SkOSMenu::TriState hinting) :
-        fLCDState(lcd), fAAState(aa), fFilterState(filter), fHintingState(hinting) {}
+                    SkOSMenu::TriState subpixel, int hinting)
+        : fLCDState(lcd), fAAState(aa), fFilterState(filter), fSubpixelState(subpixel)
+        , fHintingState(hinting) {}
 
     virtual bool filter(SkPaint* paint, Type t) {
         if (kText_Type == t && SkOSMenu::kMixedState != fLCDState) {
@@ -479,10 +493,11 @@
         if (SkOSMenu::kMixedState != fFilterState) {
             paint->setFilterBitmap(SkOSMenu::kOnState == fFilterState);
         }
-        if (SkOSMenu::kMixedState != fHintingState) {
-            paint->setHinting(SkOSMenu::kOnState == fHintingState ?
-                              SkPaint::kNormal_Hinting :
-                              SkPaint::kSlight_Hinting);
+        if (SkOSMenu::kMixedState != fSubpixelState) {
+            paint->setSubpixelText(SkOSMenu::kOnState == fSubpixelState);
+        }
+        if (0 != fHintingState && fHintingState < SK_ARRAY_COUNT(gHintingStates)) {
+            paint->setHinting(gHintingStates[fHintingState].hinting);
         }
         return true;
     }
@@ -491,7 +506,8 @@
     SkOSMenu::TriState  fLCDState;
     SkOSMenu::TriState  fAAState;
     SkOSMenu::TriState  fFilterState;
-    SkOSMenu::TriState  fHintingState;
+    SkOSMenu::TriState  fSubpixelState;
+    int fHintingState;
 };
 
 //////////////////////////////////////////////////////////////////////////////
@@ -767,7 +783,6 @@
     fRotate = false;
     fPerspAnim = false;
     fPerspAnimTime = 0;
-    fScale = false;
     fRequestGrabImage = false;
     fPipeState = SkOSMenu::kOffState;
     fTilingState = SkOSMenu::kOffState;
@@ -776,7 +791,8 @@
     fLCDState = SkOSMenu::kMixedState;
     fAAState = SkOSMenu::kMixedState;
     fFilterState = SkOSMenu::kMixedState;
-    fHintingState = SkOSMenu::kMixedState;
+    fSubpixelState = SkOSMenu::kMixedState;
+    fHintingState = 0;
     fFlipAxis = 0;
     fScrollTestX = fScrollTestY = 0;
 
@@ -814,7 +830,14 @@
     fAppMenu->assignKeyEquivalentToItem(itemID, 'l');
     itemID = fAppMenu->appendTriState("Filter", "Filter", sinkID, fFilterState);
     fAppMenu->assignKeyEquivalentToItem(itemID, 'n');
-    itemID = fAppMenu->appendTriState("Hinting", "Hinting", sinkID, fHintingState);
+    itemID = fAppMenu->appendTriState("Subpixel", "Subpixel", sinkID, fSubpixelState);
+    fAppMenu->assignKeyEquivalentToItem(itemID, 's');
+    itemID = fAppMenu->appendList("Hinting", "Hinting", sinkID, fHintingState,
+                                  gHintingStates[0].name,
+                                  gHintingStates[1].name,
+                                  gHintingStates[2].name,
+                                  gHintingStates[3].name,
+                                  gHintingStates[4].name);
     fAppMenu->assignKeyEquivalentToItem(itemID, 'h');
 
     fUsePipeMenuItemID = fAppMenu->appendTriState("Pipe", "Pipe" , sinkID,
@@ -1382,14 +1405,6 @@
 }
 
 void SampleWindow::beforeChild(SkView* child, SkCanvas* canvas) {
-    if (fScale) {
-        SkScalar scale = SK_Scalar1 * 7 / 10;
-        SkScalar cx = this->width() / 2;
-        SkScalar cy = this->height() / 2;
-        canvas->translate(cx, cy);
-        canvas->scale(scale, scale);
-        canvas->translate(-cx, -cy);
-    }
     if (fRotate) {
         SkScalar cx = this->width() / 2;
         SkScalar cy = this->height() / 2;
@@ -1534,8 +1549,8 @@
 }
 
 void SampleWindow::installDrawFilter(SkCanvas* canvas) {
-    canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState,
-                                              fFilterState, fHintingState))->unref();
+    canvas->setDrawFilter(new FlagsDrawFilter(fLCDState, fAAState, fFilterState, fSubpixelState,
+                                              fHintingState))->unref();
 }
 
 void SampleWindow::postAnimatingEvent() {
@@ -1601,7 +1616,8 @@
     if (SkOSMenu::FindTriState(evt, "AA", &fAAState) ||
         SkOSMenu::FindTriState(evt, "LCD", &fLCDState) ||
         SkOSMenu::FindTriState(evt, "Filter", &fFilterState) ||
-        SkOSMenu::FindTriState(evt, "Hinting", &fHintingState) ||
+        SkOSMenu::FindTriState(evt, "Subpixel", &fSubpixelState) ||
+        SkOSMenu::FindListIndex(evt, "Hinting", &fHintingState) ||
         SkOSMenu::FindSwitchState(evt, "Clip", &fUseClip) ||
         SkOSMenu::FindSwitchState(evt, "Zoomer", &fShowZoomer) ||
         SkOSMenu::FindSwitchState(evt, "Magnify", &fMagnify) ||
@@ -1771,11 +1787,6 @@
             }
             return true;
 #endif
-        case 's':
-            fScale = !fScale;
-            this->inval(NULL);
-            this->updateTitle();
-            return true;
         default:
             break;
     }
@@ -2030,9 +2041,6 @@
     if (fAnimating) {
         title.prepend("<A> ");
     }
-    if (fScale) {
-        title.prepend("<S> ");
-    }
     if (fRotate) {
         title.prepend("<R> ");
     }
@@ -2045,9 +2053,11 @@
 
     title.prepend(trystate_str(fLCDState, "LCD ", "lcd "));
     title.prepend(trystate_str(fAAState, "AA ", "aa "));
-    title.prepend(trystate_str(fFilterState, "H ", "h "));
+    title.prepend(trystate_str(fFilterState, "N ", "n "));
+    title.prepend(trystate_str(fSubpixelState, "S ", "s "));
     title.prepend(fFlipAxis & kFlipAxis_X ? "X " : NULL);
     title.prepend(fFlipAxis & kFlipAxis_Y ? "Y " : NULL);
+    title.prepend(gHintingStates[fHintingState].label);
 
     if (fZoomLevel) {
         title.prependf("{%.2f} ", SkScalarToFloat(fZoomLevel));