Author: matt
Date: 2009-04-15 01:35:28 -0700 (Wed, 15 Apr 2009)
New Revision: 6765
Log:
More Fl_Input keyboard fixes / OS X transparency for RGBA data / some utf8 
reorganisation

Modified:
   branches/branch-1.3/CHANGES
   branches/branch-1.3/FL/Fl.H
   branches/branch-1.3/FL/Fl_Input_.H
   branches/branch-1.3/FL/fl_utf8.h
   branches/branch-1.3/src/Fl_Input.cxx
   branches/branch-1.3/src/Fl_Input_.cxx
   branches/branch-1.3/src/Fl_Text_Buffer.cxx
   branches/branch-1.3/src/Fl_Text_Display.cxx
   branches/branch-1.3/src/Fl_Text_Editor.cxx
   branches/branch-1.3/src/fl_draw_image_mac.cxx
   branches/branch-1.3/src/fl_utf.c
   branches/branch-1.3/src/fl_utf8.cxx
   branches/branch-1.3/test/unittest_images.cxx

Modified: branches/branch-1.3/CHANGES
===================================================================
--- branches/branch-1.3/CHANGES 2009-04-14 08:18:52 UTC (rev 6764)
+++ branches/branch-1.3/CHANGES 2009-04-15 08:35:28 UTC (rev 6765)
@@ -1,6 +1,8 @@
 CHANGES IN FLTK 1.3.0
 
-       - Added improved OS X cursor control to Fl_Input (STR #2169)
+       - Fixed fl_draw_image to obey the alpha channel, hoping that 
+         this has no adverse effect on existing software (OS X only)
+       - Added OS X cursor control to Fl_Input (STR #2169)
        - Fix for multiple popups, when dragging and calling fl_alert()
          and friends from the callback (STR #2159)
        - Avoiding crashes for recursive common dialogs (this does not 

Modified: branches/branch-1.3/FL/Fl.H
===================================================================
--- branches/branch-1.3/FL/Fl.H 2009-04-14 08:18:52 UTC (rev 6764)
+++ branches/branch-1.3/FL/Fl.H 2009-04-15 08:35:28 UTC (rev 6765)
@@ -1014,6 +1014,11 @@
 
 };
 
+ /** \defgroup  fl_unicode  Unicode and UTF-8 functions
+       fl global Unicode and UTF-8 ahndling functions
+     @{ */
+ /** @} */
+
 #endif // !Fl_H
 
 //

Modified: branches/branch-1.3/FL/Fl_Input_.H
===================================================================
--- branches/branch-1.3/FL/Fl_Input_.H  2009-04-14 08:18:52 UTC (rev 6764)
+++ branches/branch-1.3/FL/Fl_Input_.H  2009-04-15 08:35:28 UTC (rev 6765)
@@ -145,7 +145,7 @@
       Same as value()[n], but may be faster in plausible
       implementations. No bounds checking is done. 
   */
-char index(int i) const {return value_[i];}
+  char index(int i) const {return value_[i];}
   /**
       Returns the number of characters in value(). This
       may be greater than strlen(value()) if there are nul
@@ -265,6 +265,10 @@
   */
   void wrap(int b) { if (b) type((uchar)(type() | FL_INPUT_WRAP));
                          else type((uchar)(type() & ~FL_INPUT_WRAP)); }
+  /**
+    Return the number of lines displayed on a single page.
+   */
+  int linesPerPage();
 };
 
 #endif 

Modified: branches/branch-1.3/FL/fl_utf8.h
===================================================================
--- branches/branch-1.3/FL/fl_utf8.h    2009-04-14 08:18:52 UTC (rev 6764)
+++ branches/branch-1.3/FL/fl_utf8.h    2009-04-15 08:35:28 UTC (rev 6765)
@@ -30,6 +30,11 @@
 
 /*** NOTE : all functions are LIMITED to 24 bits Unicode values !!! ***/
 
+/**
+  \file fl_utf8.h
+  \brief header for Unicode and UTF8 chracter handling
+*/
+
 #ifndef _HAVE_FL_UTF8_HDR_
 #define _HAVE_FL_UTF8_HDR_
 
@@ -78,12 +83,20 @@
 extern "C" {
 #  endif
 
+/** \addtogroup fl_unicode
+    @{
+*/
+
 int fl_unichar_to_utf8_size(Fl_Unichar);
   
 /* F2: comes from FLTK2 */
 /* OD: comes from OksiD */
 
-/* F2: How many bytes will be used to encode this wide character as UTF8? */
+/**
+  Return the number of bytes needed to encode the given UCS4 character in UTF8.
+  \param [in] ucs UCS4 encoded character
+  \return number of bytes required
+ */
 FL_EXPORT int fl_utf8bytes(unsigned ucs);
 
 /* OD: returns the byte length of the first UTF-8 char sequence (returns -1 if 
not valid) */
@@ -222,6 +235,9 @@
 /* OD: recursively create a path in the file system */
 FL_EXPORT char fl_make_path( const char *path );
 
+
+/** @} */
+
 /*****************************************************************************/
 
 #ifdef __cplusplus

Modified: branches/branch-1.3/src/Fl_Input.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Input.cxx        2009-04-14 08:18:52 UTC (rev 
6764)
+++ branches/branch-1.3/src/Fl_Input.cxx        2009-04-15 08:35:28 UTC (rev 
6765)
@@ -146,10 +146,27 @@
     if (Fl::event_state() & FL_CTRL) ascii = ctrl('C');
     else if (Fl::event_state() & FL_SHIFT) ascii = ctrl('V');
     break;
-  case FL_Delete: // FIXME
-    if (Fl::event_state() & FL_SHIFT) ascii = ctrl('X');
-    else ascii = ctrl('D');
-    break;    
+  case FL_Delete:
+#ifdef __APPLE__
+    if (mods==0 || mods==FL_CTRL) { // delete next char
+      ascii = ctrl('D');
+    } else if (mods==FL_ALT) { // delete next word
+      if (mark() != position()) return cut();
+      cut(position(), word_end(position()));
+      return 1;
+    } else if (mods==FL_META) { // delete to the end of the line
+      if (mark() != position()) return cut();
+      cut(position(), line_end(position()));
+      return 1;
+    } else return 1;
+#else
+    if (mods==0) {
+      ascii = ctrl('D'); 
+    } else if (mods==FL_SHIFT) {
+      ascii = ctrl('X');
+    } else return 1;
+#endif
+    break;
   case FL_Left:
 #ifdef __APPLE__
     if (mods==0) { // char left
@@ -190,18 +207,31 @@
     } else return 1;
 #endif // __APPLE__
     break;
-  case FL_Page_Up: // FIXME
-    fl_font(textfont(),textsize()); //ensure current font is set to ours
-    repeat_num=h()/fl_height(); // number of lines to scroll
-    if (!repeat_num) repeat_num=1;
+  case FL_Page_Up:
+#ifdef __APPLE__
+    if (mods==0) { // scroll text one page
+      // OS X scrolls the view, but does not move the cursor
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      repeat_num = linesPerPage();
+      ascii = ctrl('P');
+    } else if (mods==FL_ALT) { // move cursor one page
+      repeat_num = linesPerPage();
+      ascii = ctrl('P');
+    } else return 1;
+    break;
+#else
+    repeat_num = linesPerPage();
+    // fall through
+#endif
   case FL_Up:
 #ifdef __APPLE__
     if (mods==0) { // line up
       ascii = ctrl('P');
-    } else if (mods==FL_CTRL) {
-      return 1; // FIXME scroll text down one page
-                // FIXME Fl_Inut_ does not support an independent scroll value 
-                //       (heck, it doesn't even support a scrollbar - what do 
you expect ;-)
+    } else if (mods==FL_CTRL) { // scroll text down one page
+      // OS X scrolls the view, but does not move the cursor
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      repeat_num = linesPerPage();
+      ascii = ctrl('P');
     } else if (mods==FL_ALT) { // line start and up
       if (line_start(position())==position() && position()>0)
         return shift_position(line_start(position()-1)) + NORMAL_INPUT_MOVE;
@@ -214,21 +244,37 @@
 #else
     if (mods==0) { // line up
       ascii = ctrl('P');
-    } else if (mods==FL_CTRL) {
-      return 1; // FIXME scroll text down one line
+    } else if (mods==FL_CTRL) { // scroll text down one line
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      ascii = ctrl('P');
     } else return 1;
 #endif
     break;
-  case FL_Page_Down: // FIXME
-    fl_font(textfont(),textsize());
-    repeat_num=h()/fl_height();
-    if (!repeat_num) repeat_num=1;
+  case FL_Page_Down:
+#ifdef __APPLE__
+    if (mods==0) { // scroll text one page
+      // OS X scrolls the view, but does not move the cursor
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      repeat_num = linesPerPage();
+      ascii = ctrl('N');
+    } else if (mods==FL_ALT) { // move cursor one page
+      repeat_num = linesPerPage();
+      ascii = ctrl('N');
+    } else return 1;
+    break;
+#else
+    repeat_num = linesPerPage();
+    // fall through
+#endif
   case FL_Down:
 #ifdef __APPLE__
     if (mods==0) { // line down
       ascii = ctrl('N');
     } else if (mods==FL_CTRL) {
-      return 1; // FIXME scroll text up one page
+      // OS X scrolls the view, but does not move the cursor
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      repeat_num = linesPerPage();
+      ascii = ctrl('N');
     } else if (mods==FL_ALT) { // line end and down
       if (line_end(position())==position() && position()<size())
         return shift_position(line_end(position()+1)) + NORMAL_INPUT_MOVE;
@@ -241,15 +287,19 @@
 #else
     if (mods==0) { // line down
       ascii = ctrl('N');
-    } else if (mods==FL_CTRL) {
-      return 1; // FIXME scroll text up one line
+    } else if (mods==FL_CTRL) { // scroll text up one line
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      ascii = ctrl('N');
     } else return 1;
 #endif
     break;
   case FL_Home:
 #ifdef __APPLE__
-    if (mods==0) {
-      return 1; // FIXME scroll display to the top
+    if (mods==0) { // scroll display to the top
+      // OS X scrolls the view, but does not move the cursor
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      shift_position(0);
+      return 1;
     } else return 1;
 #else
     if (mods==0) {
@@ -262,8 +312,11 @@
     break;
   case FL_End:
 #ifdef __APPLE__
-    if (mods==0) {
-      return 1; // FIXME scroll display to the bottom
+    if (mods==0) { // scroll display to the bottom
+      // OS X scrolls the view, but does not move the cursor
+      // Fl_Input has no scroll control, so instead we move the cursor by one 
page
+      shift_position(size());
+      return 1; 
     } else return 1;
 #else
     if (mods==0) {

Modified: branches/branch-1.3/src/Fl_Input_.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Input_.cxx       2009-04-14 08:18:52 UTC (rev 
6764)
+++ branches/branch-1.3/src/Fl_Input_.cxx       2009-04-15 08:35:28 UTC (rev 
6765)
@@ -1024,6 +1024,16 @@
   if (bufsize) free((void*)buffer);
 }
 
+int Fl_Input_::linesPerPage() {
+  int n = 1;
+  if (input_type() == FL_MULTILINE_INPUT) {
+    fl_font(textfont(),textsize()); //ensure current font is set to ours
+    n = h()/fl_height(); // number of lines to scroll
+    if (n<=0) n = 1;
+  }
+  return n;
+}
+
 //
 // End of "$Id$".
 //

Modified: branches/branch-1.3/src/Fl_Text_Buffer.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Text_Buffer.cxx  2009-04-14 08:18:52 UTC (rev 
6764)
+++ branches/branch-1.3/src/Fl_Text_Buffer.cxx  2009-04-15 08:35:28 UTC (rev 
6765)
@@ -83,27 +83,6 @@
 static int undoinsert; // number of characters inserted
 static int undoyankcut;        // length of valid contents of buffer, even if 
undocut=0
 
-static int utf_len(char c)
-{
-  if (!(c & 0x80)) return 1;
-  if (c & 0x40) {
-    if (c & 0x20) {
-      if (c & 0x10) {
-        if (c & 0x08) {
-          if (c & 0x04) {
-            return 6;
-          }
-          return 5;
-        }
-        return 4;
-      }
-      return 3;
-    }
-    return 2;
-  }
-  return 0;
-}
-
 static void undobuffersize(int n) {
   if (n > undobufferlength) {
     if (undobuffer) {
@@ -991,7 +970,7 @@
                            mTabDist, mNullSubsChar);
   if (ret > 1 && (c & 0x80)) {
     int i;
-    i = utf_len(c);
+    i = fl_utf8len(c);
     while (i > 1) {
       i--;
       pos++;
@@ -1040,7 +1019,7 @@
     return 0;
   } else if (c & 0x80) {
     *outStr = c;
-    return utf_len(c);
+    return fl_utf8len(c);
   }
 
   /* Otherwise, just return the character */
@@ -1068,7 +1047,7 @@
   else if ((c & 0x80) && !(c & 0x40))
     return 0;
   else if (c & 0x80) {
-    return utf_len(c);
+    return fl_utf8len(c);
   }
   return 1;
 }

Modified: branches/branch-1.3/src/Fl_Text_Display.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Text_Display.cxx 2009-04-14 08:18:52 UTC (rev 
6764)
+++ branches/branch-1.3/src/Fl_Text_Display.cxx 2009-04-15 08:35:28 UTC (rev 
6765)
@@ -77,27 +77,6 @@
 // CET - FIXME
 #define TMPFONTWIDTH 6
 
-static int utf_len(char c)
-{
-  if (!(c & 0x80)) return 1;
-  if (c & 0x40) {
-    if (c & 0x20) {
-      if (c & 0x10) {
-        if (c & 0x08) {
-         if (c & 0x04) {
-            return 6;
-          }
-          return 5;
-        }
-        return 4;
-      }
-      return 3;
-    }
-    return 2;
-  }
-  return 0;
-}
-
 /**  Creates a new text display widget.*/
 Fl_Text_Display::Fl_Text_Display(int X, int Y, int W, int H,  const char* l)
     : Fl_Group(X, Y, W, H, l) {
@@ -872,7 +851,7 @@
               mBuffer->tab_distance(), mBuffer->null_substitution_character() 
);
     if (charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
       int i, ii = 0;;
-      i = utf_len(lineStr[ charIndex ]);
+      i = fl_utf8len(lineStr[ charIndex ]);
       while (i > 1) {
         i--;
         ii++;
@@ -1626,7 +1605,7 @@
                                                 expandedChar, 
buf->tab_distance(), buf->null_substitution_character() );
     if (charIndex < lineLen && charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
       int i, ii = 0;;
-      i = utf_len(lineStr[ charIndex ]);
+      i = fl_utf8len(lineStr[ charIndex ]);
       while (i > 1) {
         i--;
         ii++;
@@ -1664,7 +1643,7 @@
                                                 buf->tab_distance(), 
buf->null_substitution_character() );
     if (charIndex < lineLen && charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
       int i, ii = 0;;
-      i = utf_len(lineStr[ charIndex ]);
+      i = fl_utf8len(lineStr[ charIndex ]);
       while (i > 1) {
         i--;
         ii++;
@@ -1687,7 +1666,7 @@
         *outPtr = expandedChar[ i ];
         int l = 1;
         if (*outPtr & 0x80) {
-          l = utf_len(*outPtr);
+          l = fl_utf8len(*outPtr);
         }
         charWidth = string_width( &expandedChar[ i ], l, charStyle );
       } else
@@ -1711,7 +1690,7 @@
                                                 buf->tab_distance(), 
buf->null_substitution_character() );
     if (charIndex < lineLen && charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
       int i, ii = 0;;
-      i = utf_len(lineStr[ charIndex ]);
+      i = fl_utf8len(lineStr[ charIndex ]);
       while (i > 1) {
         i--;
         ii++;
@@ -1734,7 +1713,7 @@
         *outPtr = expandedChar[ i ];
         int l = 1;
         if (*outPtr & 0x80) {
-          l = utf_len(*outPtr);
+          l = fl_utf8len(*outPtr);
         }
         charWidth = string_width( &expandedChar[ i ], l, charStyle );
       } else
@@ -2071,7 +2050,7 @@
               mBuffer->tab_distance(), mBuffer->null_substitution_character() 
);
     if (charLen > 1 && (lineStr[ charIndex ] & 0x80)) {
       int i, ii = 0;;
-      i = utf_len(lineStr[ charIndex ]);
+      i = fl_utf8len(lineStr[ charIndex ]);
       while (i > 1) {
         i--;
         ii++;

Modified: branches/branch-1.3/src/Fl_Text_Editor.cxx
===================================================================
--- branches/branch-1.3/src/Fl_Text_Editor.cxx  2009-04-14 08:18:52 UTC (rev 
6764)
+++ branches/branch-1.3/src/Fl_Text_Editor.cxx  2009-04-15 08:35:28 UTC (rev 
6765)
@@ -34,26 +34,6 @@
 #include <FL/Fl_Text_Editor.H>
 #include <FL/fl_ask.H>
 
-static int utf_len(char c)
-{
-  if (!(c & 0x80)) return 1;
-  if (c & 0x40) {
-    if (c & 0x20) {
-      if (c & 0x10) {
-        if (c & 0x08) {
-          if (c & 0x04) {
-            return 6;
-          }
-          return 5;
-        }
-        return 4;
-      }
-      return 3;
-    }
-    return 2;
-  }
-  return 0;
-}
 
 /* Keyboard Control Matrix
 
@@ -268,7 +248,7 @@
     int l = 1;
     char c = e->buffer()->character(e->insert_position());
     if (c & 0x80 && c & 0x40) {
-      l = utf_len(c);
+      l = fl_utf8len(c);
     }
     e->buffer()->select(e->insert_position(), e->insert_position()+l);
   }
@@ -429,7 +409,7 @@
     int l = 1;
     char c = e->buffer()->character(e->insert_position());
     if (c & 0x80 && c & 0x40) {
-      l = utf_len(c);
+      l = fl_utf8len(c);
     }
     e->buffer()->select(e->insert_position(), e->insert_position()+l);
   }

Modified: branches/branch-1.3/src/fl_draw_image_mac.cxx
===================================================================
--- branches/branch-1.3/src/fl_draw_image_mac.cxx       2009-04-14 08:18:52 UTC 
(rev 6764)
+++ branches/branch-1.3/src/fl_draw_image_mac.cxx       2009-04-15 08:35:28 UTC 
(rev 6765)
@@ -75,7 +75,8 @@
     lut = CGColorSpaceCreateDeviceRGB();
   CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, 
linedelta*H, 0L);
   CGImageRef        img = CGImageCreate( W, H, 8, 8*delta, linedelta,
-                            lut, 
delta&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
+                            //lut, 
delta&1?kCGImageAlphaNone:kCGImageAlphaNoneSkipLast,
+                            lut, delta&1?kCGImageAlphaNone:kCGImageAlphaLast,
                             src, 0L, false, kCGRenderingIntentDefault);
   // draw the image into the destination context
   if (img) {

Modified: branches/branch-1.3/src/fl_utf.c
===================================================================
--- branches/branch-1.3/src/fl_utf.c    2009-04-14 08:18:52 UTC (rev 6764)
+++ branches/branch-1.3/src/fl_utf.c    2009-04-15 08:35:28 UTC (rev 6765)
@@ -28,6 +28,11 @@
 #include <string.h>
 #include <stdlib.h>
 
+/** \addtogroup fl_unicode
+    @{
+*/
+
+
 #if 0
   /** 
    \defgroup fl_unichar Unicode Character Functions
@@ -844,3 +849,5 @@
   }
   return ret;
 }
+
+/** @} */

Modified: branches/branch-1.3/src/fl_utf8.cxx
===================================================================
--- branches/branch-1.3/src/fl_utf8.cxx 2009-04-14 08:18:52 UTC (rev 6764)
+++ branches/branch-1.3/src/fl_utf8.cxx 2009-04-15 08:35:28 UTC (rev 6765)
@@ -76,6 +76,10 @@
 
 #undef fl_open
 
+/** \addtogroup fl_unicode
+    @{
+*/
+
 /*** NOTE : all functions are LIMITED to 24 bits Unicode values !!! ***/
 /***        but only 16 bits are really used under Linux and win32  ***/
 
@@ -793,6 +797,8 @@
   free( p );
 }
 
+/** @} */
+
 //
 // End of "$Id: $".
 //

Modified: branches/branch-1.3/test/unittest_images.cxx
===================================================================
--- branches/branch-1.3/test/unittest_images.cxx        2009-04-14 08:18:52 UTC 
(rev 6764)
+++ branches/branch-1.3/test/unittest_images.cxx        2009-04-15 08:35:28 UTC 
(rev 6765)
@@ -42,10 +42,10 @@
     drgba = img_rgba = (uchar*)malloc(128*128*4);
     for (y=0; y<128; y++) {
       for (x=0; x<128; x++) {
-        *drgb++ = *drgba = *dg++ = *dga++ = y<<1;
-        *drgb++ = *drgba = x<<1;
-        *drgb++ = *drgba = (127-x)<<1;
-        *dga++ = *drgba = x+y;
+        *drgba++ = *drgb++ = *dga++ = *dg++ = y<<1;
+        *drgba++ = *drgb++                  = x<<1;
+        *drgba++ = *drgb++                  = (127-x)<<1;
+        *drgba++           = *dga++         = x+y;
       }
     }
     return new ImageTest(TESTAREA_X, TESTAREA_Y, TESTAREA_W, TESTAREA_H);
@@ -64,20 +64,24 @@
   }
   void draw() {
     Fl_Box::draw();
+
     int xx = x()+10, yy = y()+10;
     fl_color(FL_BLACK); fl_rect(xx, yy, 130, 130);
     fl_draw_image(img_rgb, xx+1, yy+1, 128, 128, 3);
     fl_draw("RGB", xx+134, yy+64);
+
     xx = x()+10; yy = y()+10+134;
     fl_color(FL_BLACK); fl_rectf(xx, yy, 130, 130);
     fl_color(FL_WHITE); fl_rectf(xx+1, yy+1, 64, 64);
     fl_color(FL_WHITE); fl_rectf(xx+65, yy+65, 64, 64);
     fl_draw_image(img_rgba, xx+1, yy+1, 128, 128, 4);
     fl_color(FL_BLACK); fl_draw("RGBA", xx+134, yy+64);
+
     xx = x()+10+200; yy = y()+10;
     fl_color(FL_BLACK); fl_rect(xx, yy, 130, 130);
     fl_draw_image(img_gray, xx+1, yy+1, 128, 128, 1);
     fl_draw("Gray", xx+134, yy+64);
+
     xx = x()+10+200; yy = y()+10+134;
     fl_color(FL_BLACK); fl_rectf(xx, yy, 130, 130);
     fl_color(FL_WHITE); fl_rectf(xx+1, yy+1, 64, 64);

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to