[Laszlo-checkins] r5568 - in openlaszlo/branches/legals: WEB-INF/lps/lfc/kernel/dhtml WEB-INF/lps/lfc/kernel/swf WEB-INF/lps/lfc/views WEB-INF/lps/schema test/lztest test/text

ben@openlaszlo.org ben at openlaszlo.org
Sun Jul 1 20:03:10 PDT 2007


Author: ben
Date: 2007-07-01 20:03:04 -0700 (Sun, 01 Jul 2007)
New Revision: 5568

Modified:
   openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
   openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzSprite.as
   openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzTextSprite.as
   openlaszlo/branches/legals/WEB-INF/lps/lfc/views/LzText.lzs
   openlaszlo/branches/legals/WEB-INF/lps/schema/lzx.rnc
   openlaszlo/branches/legals/test/lztest/lztest-textstyle.lzx
   openlaszlo/branches/legals/test/text/renderingcomparison.lzx
Log:
Change 20070701-ben-d by ben at cooper.local on 2007-07-01 20:01:49 PDT
    in /Users/ben/src/svn/openlaszlo/branches/legals2
    for http://svn.openlaszlo.org/openlaszlo/branches/legals

Summary: [UPDATED] Improve text rendering in swf8, add api for text rendering hints

New Features: new api on LzText to control swf8 rendering parameters

Bugs Fixed:

Technical Reviewer: max 
QA Reviewer: (pending)
Doc Reviewer: (pending)

Documentation:

Added four new virtual attributes to LzText, each of which control an aspect
of advanced text rendering in swf8: sharpness, thickness, antiAliasType, 
and gridFit. These attributes only have an effect in swf8; in other runtimes,
they will quietly be no-ops. We provide set/get for each of these new virtual
attributes, and give them good initial and default values. 

Note that the default values are set such that <text>boring</text> will 
use normal rendering, because advanced rendering causes a performance hit. To
get the advanced rendering, just set antiAliasType="advanced" on the text
object. 

Added capability "advancedfonts" for these text rendering attributes; made it
true for swf, false for dhtml. 

Release Notes:
To get advanced rendering in swf8, just set antiAliasType="advanced" on a text
object.

Details:

Tests:
http://localhost:8080/legals/test/lztest/lztest-textstyle.lzx?lzr=swf8&debug=true
sussurate should look good but blurry. mimsy borogroves should look not great. 
"i should look bad" and "pixel gridfit" should have weird color bands around the text
If you visit that url in Flash Player 7, all the text should look the same, and a 
bit crunchy. 
"ant doc" still works
http://localhost:8080/legals/test/text/renderingcomparison.lzx?lzr=swf8 
 should look really cool, with each of the text objects in the top three
 rows looking slightly different.
 


Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js	2007-07-02 03:03:04 UTC (rev 5568)
@@ -217,6 +217,7 @@
     ,audio: false
     ,accessibility: false
     ,htmlinputtext: false
+    ,advancedfonts: false
 }
 
 LzSprite.prototype.__updateQuirks = function(){
@@ -1455,15 +1456,7 @@
     this.__contextmenu = cmenu;
 }
 
-/**
-  * LzView.getContextMenu
-  * Return the current context menu
-  */
-LzSprite.prototype.getContextMenu = function() {
-    return this.__contextmenu;
-}
 
-
 if (LzSprite.prototype.quirks.ie_leak_prevention) {
     LzSprite.prototype.__sprites = {};
 

Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzSprite.as
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzSprite.as	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzSprite.as	2007-07-02 03:03:04 UTC (rev 5568)
@@ -39,6 +39,7 @@
     ,audio: true
     ,accessibility: true
     ,htmlinputtext: true
+    ,advancedfonts: true
 }
 
 /**
@@ -1534,7 +1535,6 @@
 LzSprite.prototype.setContextMenu = function ( cmenu ){
     // For back compatibility, we accept either LzContextMenu or (Flash primitive) ContextMenu
     if (! (cmenu instanceof ContextMenu)) {
-        this.__contextmenu = cmenu;
         cmenu = cmenu.__LZcontextMenu();
     } else {
         if ($debug) Debug.warn("Passing a Flash ContextMenu to LzView.setContextMenu is deprecated, use LzContextMenu instead");
@@ -1561,15 +1561,6 @@
 }
 
 /**
-  * LzView.getContextMenu
-  * Return the current context menu
-  */
-LzSprite.prototype.getContextMenu = function() {
-    return this.__contextmenu;
-}
-
-
-/**
   * Register for update when the button gets the focus.
   * Set the behavior of the enter key depending on whether the field is
   * multiline or not.

Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzTextSprite.as
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzTextSprite.as	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/swf/LzTextSprite.as	2007-07-02 03:03:04 UTC (rev 5568)
@@ -745,8 +745,73 @@
 }
 
 
+/***
+ * Sets what type of antialiasing the text field should use. Only works in swf8
+ * and higher. 
+ * @param aliasType "normal" or "advanced"
+ */
+LzTextSprite.prototype.setAntiAliasType = function( aliasType ){
+    this.__LZtextclip.antiAliasType = aliasType;
+}
 
 /**
+ * Gets the kind of antialiasing set on this text object
+ */ 
+LzTextSprite.prototype.getAntiAliasType = function() {
+    return this.__LZtextclip.antiAliasType;
+}
+
+/***
+ * Sets what type of gridfitting the text field should use. Only works in swf8
+ * and higher. 
+ * @param gridFit "none" "subpixel" or "pixel"
+ */
+LzTextSprite.prototype.setGridFit = function( gridFit ){
+    this.__LZtextclip.gridFit = gridFit;
+}
+
+/**
+ * Gets the kind of antialiasing set on this text object
+ */ 
+LzTextSprite.prototype.getGridFit = function() {
+    return this.__LZtextclip.gridFit; 
+}
+
+
+
+/***
+ * Sets the sharpness for the text rendering 
+ * Only works in swf8 and higher. 
+ * @param sharpness -400 to 400
+ */
+LzTextSprite.prototype.setSharpness = function( sharpness ){
+    this.__LZtextclip.sharpness = sharpness;
+}
+
+/**
+* Gets the sharpness rendering property of this text object
+ */ 
+LzTextSprite.prototype.getSharpness = function() {
+    return this.__LZtextclip.sharpness;
+}
+
+/***
+ * Sets the thickness for the text rendering 
+ * Only works in swf8 and higher. 
+ * @param thickness -200 to 200
+ */
+LzTextSprite.prototype.setThickness = function( thickness ){
+     this.__LZtextclip.thickness = thickness;
+}
+
+/**
+* Gets the thickness rendering property of this text object
+ */ 
+LzTextSprite.prototype.getThickness = function() {
+    return this.__LZtextclip.thickness;
+}
+
+/**
   * @access private
   */
 LzTextSprite.prototype.__LZforceScrollAttrs = function () {

Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/views/LzText.lzs
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/views/LzText.lzs	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/views/LzText.lzs	2007-07-02 03:03:04 UTC (rev 5568)
@@ -44,7 +44,10 @@
   * @initarg String text
   * @initarg Number maxlength:  maximum number of characters allowed in this field
   * default: null
-  *
+  * @initarg String antiAliasType (swf8 only)
+  * @initarg String gridFit (swf8 only)
+  * @initarg Number sharpness  (swf8 only)
+  * @initarg Number thickness (swf8 only)
   * @initarg String pattern:  regexp describing set of characters allowed in this field
   * Restrict the characters that can be entered to a pattern
   * specified by a regular expression.
@@ -246,6 +249,31 @@
         this.setPattern(args.pattern);
     }
 
+
+    if ('antiAliasType' in args && args.antiAliasType != null) {
+        this.setAntiAliasType(args.antiAliasType);
+    } else {
+        this.setAntiAliasType("normal"); 
+    }
+
+    if ('gridFit' in args && args.gridFit != null) {
+        this.setGridFit(args.gridFit);
+    } else {
+        this.setGridFit("subpixel");
+    }
+
+    if ('sharpness' in args && args.sharpness != null) {
+        this.setSharpness(args.sharpness);
+    } else {
+        this.setSharpness(0);
+    }
+
+    if ('thickness' in args && args.thickness != null) {
+        this.setThickness(args.thickness);
+    } else {
+        this.setThickness(0);
+    }
+
 }
 
 /**
@@ -316,6 +344,24 @@
 
 
 /**
+  * @lzxtype string
+  * @modifiers virtual
+  */
+// no var decl since this is a virtual field
+setters.antiAliasType = "setAntiAliasType";
+defaultattrs.antiAliasType = "normal";
+
+setters.gridFit = "setGridFit";
+defaultattrs.gridfit = "subpixel";
+
+setters.sharpness = "setSharpness";
+defaultattrs.sharpness = 0;
+
+setters.thickness = "setThickness";
+defaultattrs.thickness = 0;
+
+
+/**
   * setResize set behavior of text field width when new text is added.
   * LzText only (cannot be used with LzInputText).
   * @param Boolean val: if true, the textfield will recompute it's width after setText() is called
@@ -774,9 +820,111 @@
     this.sprite.setEmbedFonts(onroff);
 }
 
+/***
+ * Sets what type of antialiasing the text field should use. Only works in swf8
+ * and higher. 
+ * @param aliasType "normal" or "advanced"
+ */
+function setAntiAliasType( aliasType ){
+    if (this.sprite.capabilities.advancedfonts) {    
+        if ((aliasType == "normal") || (aliasType == "advanced")) {
+            this.antiAliasType = aliasType; 
+            this.sprite.setAntiAliasType(aliasType);
+        } else if ($debug) {
+            Debug.warn("antiAliasType invalid, must be 'normal' or 'advanced', but you said '" + aliasType + "'");
+        }        
+    }
+}
 
+/**
+ * Gets the kind of antialiasing set on this text object
+ */ 
+function getAntiAliasType() {
+    if (this.sprite.capabilities.advancedfonts) {    
+        return this.antiAliasType;
+    }
+}
 
+/***
+ * Sets what type of grid fitting the text field should use. 
+ * Only works in swf8 and higher. 
+ * @param gridFit "none", "pixel", or "subpixel"
+ */
+function setGridFit( gridFit ){
+    if (this.sprite.capabilities.advancedfonts) {    
+        if ((gridFit == "none") || (gridFit == "pixel") || (gridFit == "subpixel")) {
+            this.gridFit = gridFit; 
+            this.sprite.setGridFit(gridFit);
+        } else if ($debug) {
+            Debug.warn("gridFit invalid, must be 'none', 'pixel', or 'subpixel' but you said '" + gridFit + "'");
+        }
+    }
+}
+
 /**
+ * Gets the kind of grid fitting set on this text object
+ */ 
+function getGridFit() {
+    if (this.sprite.capabilities.advancedfonts) {
+        return this.gridFit; 
+    }
+}
+
+
+/***
+ * Sets the sharpness for the text rendering 
+ * Only works in swf8 and higher. 
+ * @param sharpness -400 to 400
+ */
+function setSharpness( sharpness ){
+    if (this.sprite.capabilities.advancedfonts) {
+        if  ((sharpness >= -400) && (sharpness <= 400)) {
+            this.sharpness = sharpness; 
+            this.sprite.setSharpness(sharpness);
+        } else if ($debug) {
+            Debug.warn("sharpness out of range, must be -400 to 400");
+        }        
+    }
+}
+
+/**
+ * Gets the sharpness rendering property of this text object
+ */ 
+function getSharpness() {
+    if (this.sprite.capabilities.advancedfonts) {    
+        return this.sharpness; 
+    }
+}
+
+
+/***
+ * Sets the thickness for the text rendering 
+ * Only works in swf8 and higher. 
+ * @param thickness -200 to 200
+ */
+function setThickness( thickness ){
+    if (this.sprite.capabilities.advancedfonts) {
+        if  ((thickness >= -200) && (thickness <= 200)) {
+            this.thickness = thickness;
+            this.sprite.setThickness(thickness); 
+        } else if ($debug) {
+            Debug.warn("thickness out of range, must be -200 to 200");
+        }
+    }
+}
+
+/**
+ * Gets the thickness rendering property of this text object
+ */ 
+function getThickness() {
+    if (this.sprite.capabilities.advancedfonts) {    
+        return this.thickness;
+    }
+}
+
+
+
+/**
   * @access private
   */
 //TODO Remove this

Modified: openlaszlo/branches/legals/WEB-INF/lps/schema/lzx.rnc
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/schema/lzx.rnc	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/WEB-INF/lps/schema/lzx.rnc	2007-07-02 03:03:04 UTC (rev 5568)
@@ -389,8 +389,16 @@
   [a:defaultValue="null"]
   attribute maxlength {numberExpression}? &
   attribute pattern {string}? &
-  attribute label {string}?
-
+  attribute label {string}? &
+     [a:defaultValue="advanced"]
+  attribute antiAliasType {"normal" | "advanced"}? &
+     [a:defaultValue="subpixel"]  
+  attribute gridFit {"none" | "pixel" | "subpixel"}? &
+     [a:defaultValue="0"]
+  attribute sharpness {numberExpression}? &
+     [a:defaultValue="0"]  
+  attribute thickness {numberExpression}?
+    
 textContent =
   (attribute text {xsd:string}
    | text?)

Modified: openlaszlo/branches/legals/test/lztest/lztest-textstyle.lzx
===================================================================
--- openlaszlo/branches/legals/test/lztest/lztest-textstyle.lzx	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/test/lztest/lztest-textstyle.lzx	2007-07-02 03:03:04 UTC (rev 5568)
@@ -2,12 +2,18 @@
 <!--
   covers-tags : lztext
 -->
+    <font src="helmetr.ttf"               name="Helvetica" />
 
     <include href="lztest/lztestmanager.lzx" /> 
     <simplelayout axis="y" spacing="2" />
     <text id="t1" />
     <text fontstyle="bold" id="t2" fgcolor="0xffccff" />    
-    <text id="t3" />        
+    <text id="t3" font="Helvetica" />        
+    <text id="t4" font="Helvetica" fontsize="24" antiAliasType="advanced" >susurrate</text>
+    <text id="t5" font="Helvetica" fontsize="24" antiAliasType="advanced" >mimsy borogroves</text>    
+    <text id="t6" font="Helvetica" fontsize="24" antiAliasType="normal" sharpness="27" thickness="-8">hello</text>
+    <text id="t7" font="Helvetica" fontsize="24" antiAliasType="advanced" sharpness="400" gridFit="none">i should look bad</text>    
+    <text id="t8" font="Helvetica" fontsize="24" antiAliasType="advanced" sharpness="400" gridFit="pixel">pixel gridfit</text>        
 
 <script><![CDATA[
 
@@ -19,23 +25,74 @@
     LzTestManager.assertEquals( "project runway", t1.getText());
 }
 
-textStyleSuite.testColor = function () {
-
+textStyleSuite.testColor = function () {  
+   
     // color set at compile time 
     LzTestManager.assertEquals(0xffccff, t2.getAttribute("fgcolor"), "fgcolor set at compile time");
     LzTestManager.assertEquals('bold', t2.getAttribute("fontstyle"), "fontstyle set at compile time");
     
-    // color changed at runtime
+    // color changed at runtime  
     t3.setAttribute("bgcolor", 0x000088); 
     LzTestManager.assertEquals(0x000088, t3.getAttribute("bgcolor")), "bgcolor set at run time";    
     t3.setAttribute("fgcolor", 0xFF0000)
     LzTestManager.assertEquals( 0xFF0000, t3.getAttribute("fgcolor"), "fgcolor set at runtime");
 }
+   
+textStyleSuite.testRenderingHints = function () {
+    if (t2.sprite.capabilities.advancedfonts) {
+        LzTestManager.assertEquals( 0, t3.getSharpness() ); // should be 0 by default
+        LzTestManager.assertEquals( 0, t3.getThickness() ); // should be 0 by default
+        t4.setSharpness(377);
+        LzTestManager.assertEquals( 377, t4.getSharpness() );
+        t4.setThickness(112);
+        LzTestManager.assertEquals( 112, t4.getThickness() );
+        t4.setSharpness(-212);
+        LzTestManager.assertEquals( -212, t4.getSharpness() );
+    
+        LzTestManager.assertEquals( 27, t6.getSharpness() );
+        LzTestManager.assertEquals( -8, t6.getThickness() );
+    
+        LzTestManager.assertEquals( "subpixel", t2.getGridFit() );
+        LzTestManager.assertEquals( "subpixel", t3.getGridFit() );    
+        LzTestManager.assertEquals( "none", t7.getGridFit() );    
+        LzTestManager.assertEquals( "pixel", t8.getGridFit() );        
+    }
+}
 
+textStyleSuite.testRenderingDefaults = function () {    
+    if (t2.sprite.capabilities.advancedfonts) {
+        LzTestManager.assertEquals("advanced", t4.getAntiAliasType()); // should be "advanced" by default
+        LzTestManager.assertEquals("advanced", t5.getAntiAliasType()); // should be "advanced" by default
+        t5.setAntiAliasType("normal");
+        LzTestManager.assertEquals("normal", t5.getAntiAliasType()); 
+        t5.setAntiAliasType("weirdo"); // should have no effect, not a legal value
+        LzTestManager.assertEquals("normal", t5.getAntiAliasType());     
+    }
+}
+
+textStyleSuite.testHintsLimits = function () {
+    if (t2.sprite.capabilities.advancedfonts) {
+        t4.setSharpness(-212);
+        t4.setSharpness(515); // should be out of range, shouldn't change value
+        LzTestManager.assertEquals( -212, t4.getSharpness() );
+        t4.setSharpness(-2378); // should be out of range, shouldn't change value
+        LzTestManager.assertEquals( -212, t4.getSharpness() );
+        t4.setThickness(315); // should be out of range, shouldn't change value
+        LzTestManager.assertEquals( 112, t4.getThickness() );
+        t4.setThickness(-2378); // should be out of range, shouldn't change value
+        LzTestManager.assertEquals( 112, t4.getThickness() );
+    }
+}
+
+
+
+
 textStyleSuite.addTest(textStyleSuite.testJustText); 
-textStyleSuite.addTest(textStyleSuite.testColor); 
+textStyleSuite.addTest(textStyleSuite.testColor);   
+textStyleSuite.addTest(textStyleSuite.testRenderingHints); 
+textStyleSuite.addTest(textStyleSuite.testHintsLimits); 
+textStyleSuite.addTest(textStyleSuite.testRenderingDefaults);
 
-
 ]]>
 </script>
 
@@ -43,7 +100,7 @@
 </canvas>
 <!-- 
 /* X_LZ_COPYRIGHT_BEGIN ***************************************************
-* Copyright 2006 Laszlo Systems, Inc.  All Rights Reserved.          *
+* Copyright 2006-2007 Laszlo Systems, Inc.  All Rights Reserved.          *
 * Use is subject to license terms.                                        *
 * X_LZ_COPYRIGHT_END ******************************************************/
 -->

Modified: openlaszlo/branches/legals/test/text/renderingcomparison.lzx
===================================================================
--- openlaszlo/branches/legals/test/text/renderingcomparison.lzx	2007-07-02 02:49:41 UTC (rev 5567)
+++ openlaszlo/branches/legals/test/text/renderingcomparison.lzx	2007-07-02 03:03:04 UTC (rev 5568)
@@ -14,14 +14,14 @@
     </class>
 
     <class name="multitextsample" width="200">
-        <attribute name="antiAliasType" value="normal" />
-        <attribute name="gridFit" value="none" />
-        <attribute name="thickness" value="0" />
-        <attribute name="sharpness" value="0" />
+        <attribute name="antiAliasType" value="advanced" type="string" />
+        <attribute name="gridFit" value="none" type="string" />
+        <attribute name="thickness" value="0" type="number"/>
+        <attribute name="sharpness" value="0" type="number" />
         <simplelayout axis="y" />
         <sampletext fontsize="9" text="As sands in the hourglass, such are" />
         <sampletext fontsize="12" text="Carol is living proof of the resilience" />
-        <sampletext fontsize="15" text="Unfortunately, Frederic" />
+        <sampletext fontsize="15" text="Unfortunately, Oliver" />
         <sampletext fontsize="24" text="Oxygen-starved!" />
     </class>
 
@@ -86,26 +86,12 @@
               />
          </view>
 
-         <description label="gridFit = none, pixel, subpixel (antiAliasType='normal')" />
-         <view>
-              <simplelayout axis="x" spacing="5" />
-              <multitextsample id="tGFnormal"
-                  gridFit="normal"
-              />
-              <multitextsample id="tGFpixel"
-                  gridFit="pixel"
-              />
-              <multitextsample id="tGFsubpixel"
-                  gridFit="subpixel"
-              />
-         </view>
-         
          <description label="gridFit = none, pixel, subpixel (antiAliasType='advanced')" />
          <view>
               <simplelayout axis="x" spacing="5" />
               <multitextsample id="tGFnormalaaa"
-                  gridFit="normal"
-                  antiAliasType="advanced"
+                  gridFit="none"
+                  antiAliasType="advanced"  
                   width="200"
               />
               <multitextsample id="tGFpixelaaa"



More information about the Laszlo-checkins mailing list