Page 1 of 2

bugs FW14.06

Posted: Sun Jun 29, 2014 12:23 pm
by elvira
Antonio,

He detectado varios problemas.

El primero, es que el tema del rpreview y los metafiles se siguen ahorita visualizando mal y muy feitos.

Mira por ejemplo samples\invoice.prg:

Image


Y en la nueva clase AutoGet no pone el botón de ACTION, lo ignora:

oGet:bAction := { || Alert("hola") }


Sigo investigando :D :D

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 2:25 pm
by Antonio Linares
Elvira,

En la versión 14.04 se ve igual, acabo de probarlo.

Asi que posiblemente ese bug se haya introducido antes de la versión 14.04

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 2:33 pm
by elvira
Antonio,

Muy agradecida, es que se ve muy feito y eso no se puede mostrar al cliente.

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 3:55 pm
by mgsoft
Elvira,

Hay un bug en el método CreateButton() de la clase tGet.prg

Busca este código:

if ValType( ::bAction ) == "B" .and. Upper( ::ClassName() ) == "TGET"


Sin embargo, debería ser en realidad Upper( ::Super:ClassName() ), porque si hacemos una clase derivada de TGET como es el caso de AutoGet entonces no funcióna el botón.

Prueba y me dices.

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 4:55 pm
by mastintin
elvira wrote:
El primero, es que el tema del rpreview y los metafiles se siguen ahorita visualizando mal y muy feitos.

Mira por ejemplo samples\invoice.prg:

Yo ten ia el mismo problema con algunas impresoras , porque no se devolvían correctamente las resoluciones de la impresora ...
mi solución hace ya unas versiones :

Code: Select all | Expand



METHOD PaintMeta() CLASS TPreview
local   aSizes:=::oDevice:GetPhySize()
local   nAspect:= aSizes[1]/aSizes[2]
   
  ......  // unas lineas mas abajo comentar
 
    //  nAspect        := ::oDevice:nHorzSize() / ::oDevice:nVertSize()
   
     
 

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 6:35 pm
by elvira
Manuel,

Muchas gracias, voy a mirarlo.

A ver si Antonio por favor lo mira bien y saca una build corregida con todos los errores.

Muy agradecida :D

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 7:51 pm
by elvira
Hola Manuel,

Me temo que sigue viéndose mal y feito:
Image

Estos problemas empezaron en los cambios que empezó a ejecutar el Maestro el año pasado en tprinter.prg y tmetafile.prg.

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 7:54 pm
by elvira
Captura completa:

Image

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 7:56 pm
by elvira
Maestro!!!,

En la 13.09 se ve bien:

Image

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 8:14 pm
by cnavarro
Elvira
En la 13.11 también
Pero cuando entras has de dar click para que aparezcan las imágenes laterales y las proporciones correctas, no?

Re: bugs FW14.06

Posted: Sun Jun 29, 2014 8:59 pm
by elvira
Cristóbal,

Así es, tengo que dar ese click para que las proporciones se vean bien, al principio se ve mal.

Muchas gracias.

Re: bugs FW14.06

Posted: Mon Jun 30, 2014 9:09 am
by mastintin
Puedes poner aqui el código de tu prueba de impresión a ver si reproduzco el error ? .
Si usas la ventana de preview completa en vez mdi te hace lo mismo ? .
Estoy interesado en el tema, a ver si estabilizamos el código .
Paraq empezar yo he puesto una DATA en rpreview.prg :

Code: Select all | Expand



DATA   lListViewHide INIT .t.

METHOD BuildListView() CLASS TPreview

   .....
  IF ::lListviewHide
      ::oLvw:Hide()
   endif
return nil

METHOD Zoom( lMenu ) CLASS TPreview

   DEFAULT lMenu := .F.

   ::lZoom := ! ::lZoom
   IF !::lListViewHide
      if IsWindowVisible( ::oLvw:hWnd )
         ::oLvw:Hide()
      else
         ::oLvw:Show()
      endif
   endif
   .....

METHOD ResizeListView() CLASS TPreview

IF !::lListviewHide

   ::oLvw:nHeight = ::oWnd:GetCliRect():nHeight - 2 - ;
                    If( ::oWnd:oBar != nil, ::oWnd:oBar:nHeight() - 2,;
                        ::oWnd:oTop:nHeight() ) - ;
                    If( ::oWnd:oMsgBar != nil, ::oWnd:oMsgBar:nHeight(),;
                        ::oWnd:oBottom:nHeight() )

   IF ::oLvw:nLeft == 0
      if ::oMeta1:nLeft <=  ::oLvw:nWidth
         ::olvw:hide()
      else
        ::olvw:show()
      endif
   else

      ::oLvw:nLeft :=  ::oWnd:GetCliRect():nWidth -  ::oLvw:nWidth

      if ::lTwoPages
          if ::oLvw:nLeft <= ::oMeta2:nRight
             ::oLvw:hide()
          else
             ::oLvw:show()
          endif
      else
         if ::oLvw:nLeft <= ::oMeta1:nRight
            ::oLvw:hide()
         else
            ::oLvw:show()
         endif
      endif
   endif

   ::oLvw:refresh()
endif

return nil

 

Re: bugs FW14.06

Posted: Mon Jun 30, 2014 9:48 am
by elvira
Manuel,

Uso samples\invoce.prg:

Code: Select all | Expand


 #include "Fivewin.ch"
 #include "Report.ch"
 #include "FileIo.ch"


 #define    VERSION        "Versión 1.2 <14-01-2011> (Rev. 00.13)"
 #define    K_ENTER        13
 #define    COMPARTIDO     .T.
 #define    EXCLUSIVO      .F.

 #define    COLBLANCO   255,255,255

 #define        COL_BRTEX   255,255,255
 #define        COL_BRFON       0,75,105

 #define        ID_VTDBF    OemToAnsi(' Facturaci¢n PYME  ')+VERSION+CRLF+;
                            OemToAnsi(' (c) CEPEDA Servicios Inform ticos 2004')

 #define  NL  Chr( 10 ) + Chr( 13 )
 #define  SAF    100

 Static oBar
 Static oWnd
 Static oFont
 Static oIcon
 Static oBrush
 Static cNomEmp
 Static cPathEm
 Static lSelEmp
 Static cNifEmp

#include "rpreview.prg"


 Function Main()

 LOCAL aStruct
 LOCAL lCreado    := .F.
 LOCAL oSay
 LOCAL aFieldsNew := {}
 LOCAL lActivado  := .F.

 SET DATE ITALIAN
 SET DELETED ON
 SET CENTURY ON
 SET EPOCH TO 1960
 SET CONFIRM ON
 SET 3DLOOK ON

 DEFINE FONT oFont NAME "Arial" SIZE 0, -12
 ACTIVATE FONT oFont

 DEFINE ICON oIcon FILENAME "..\icons\fivetech.ICO"

 DEFINE BRUSH oBrush FILENAME "..\bitmaps\backgrnd\sky3.bmp"

 DEFINE WINDOW oWnd MDI FROM 04, 10 TO 30, 90;
        TITLE OemToAnsi( "Facturaci¢n PYME" ) ;
        MENU Menu() ;
        ICON oIcon ;
        BRUSH oBrush
        SET FONT OF oWnd TO oFont
        SET MESSAGE OF oWnd TO ;
        OemToAnsi('Facturaci¢n PYME           Usuario = '+WNetGetUser());
        TIME DATE KEYBOARD 2007

 DEFINE BUTTONBAR oBar _3D SIZE 45, 45 TOP OF oWnd 2007
 DEFINE BUTTON OF oBar FILENAME "..\bitmaps\cascade.bmp"  TOOLTIP ;
 'Facturación' ACTION PintUnaFac( oWnd ) MESSAGE 'Emisión de facturas' GROUP
 DEFINE BUTTON OF oBar FILENAME "..\bitmaps\exit.bmp"      TOOLTIP 'Terminar';
 ACTION oWnd:End() MESSAGE 'Termina el programa' GROUP

 ACTIVATE WINDOW oWnd MAXIMIZED

 Return NIL
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Static Function Menu()

 LOCAL oMenu

 MENU oMenu
   MENUITEM '&Selección' MESSAGE 'Selecci¢n de Empresa'
   MENU
     MENUITEM '&Terminar' ACTION oWnd:End() MESSAGE 'Termina el programa'
   ENDMENU
   MENUITEM '&Ventas'    MESSAGE 'Procesos generales de VENTAS'
   MENU
     MENUITEM '&Facturas' ACTION PintUnaFac( oWnd ) MESSAGE 'Emisión de facturas'
   ENDMENU
 ENDMENU
 Return oMenu

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Static Function PintUnaFac( oWnd )

 LOCAL oDlg, oFont, aoBtn[ 2 ]

 DEFINE FONT oFont NAME "Arial" SIZE  0, -12

     DEFINE DIALOG oDlg TITLE "FWH Ver. 7.11 queda el preview detrás";
 FROM 0, 0 TO 380, 350 ; //Alto y Ancho
 PIXEL OF oWnd FONT oFont

 @ 164, 72 BUTTON aoBtn[ 1 ] PROMPT "&Imprimir" PIXEL SIZE 35,10 OF oDlg ;
           ACTION Imprimir( oDlg )

 @ 164,130 BUTTON aoBtn[ 2 ] PROMPT "Sa&lir" PIXEL SIZE 35,10 OF oDlg ;
           ACTION oDlg:End()

 ACTIVATE DIALOG oDlg CENTER

 Return NIL
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Static Function Imprimir( oWnd )

 LOCAL oPrn, oFont1, oFont2, oFont3, oFont4, oFont5, oFont6, oFont7, oFont8, ;
       oFontLogo, oPen1, oPen2

 LOCAL aCoord1[ 2 ], aCoord2[ 2 ]
 LOCAL nFil, nCol, nTop, nBot
 LOCAL nAnch, nAlto
 LOCAL nPixHorz, nPixVert
 LOCAL nAncho_1, nAncho_2

 oWnd:End()

 PRINT oPrn NAME "Impresión de facturas" PREVIEW

 IF Empty( oPrn:hDC )
   MsgStop( OemToAnsi( "¡ No hay IMPRESORA para imprimir !" ))
   Return NIL
 EndIF

 nPixVert := oPrn:nVertRes()
 nPixHorz := oPrn:nHorzRes()

 IF nPixHorz < 3000
   nAnch    := 8913290
   nAlto    := 12255652
   nAncho_1 := 4
   nAncho_2 := 7
 ELSE
   nAnch := 8913494
   nAlto := 12256000
   nAncho_1 := 6
   nAncho_2 := 11
 EndIf


 DEFINE FONT oFont1 NAME "Arial" SIZE 0, -6  OF oPrn
 DEFINE FONT oFont2 NAME "Arial" SIZE 0, -9  OF oPrn
 DEFINE FONT oFont3 NAME "Arial" SIZE 0, -12 BOLD OF oPrn
 DEFINE FONT oFont4 NAME "Arial" SIZE 0, -11 OF oPrn
 DEFINE FONT oFont5 NAME "Arial" SIZE 0, -16 OF oPrn
 DEFINE FONT oFont6 NAME "Arial" SIZE 0, -10 OF oPrn
 DEFINE FONT oFont7 NAME "Courier New" SIZE 0, -10 OF oPrn
 DEFINE FONT oFont8 NAME "Times New Roman" SIZE 0, -10 BOLD OF oPrn
 DEFINE FONT oFontLogo NAME "Arial" SIZE 0, -19 BOLD OF oPrn
 DEFINE PEN   oPen1 WIDTH nAncho_1
 DEFINE PEN   oPen2 WIDTH nAncho_2

   PAGE
   // Cabecera
       nFil := 1.6
       nCol := 2.2
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       oPrn:CmSay ( 3.1,  2.3, "PRUEBA DE IMPRESIÓN", oFontLogo )

       nFil :=  4.4
       nCol := 10.9
       nTop :=  7.7
       nBot := 20.15
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Box ( nFil, nCol, nTop, nBot, oPen2 )           //Caja Cliente
       oPrn:CmSay ( 4.0, 11.0, 'Dirección Correspondencia del Cliente:', oFont2 )
       oPrn:CmSay ( 4.7, 11.1, "Juan Pérez de las Heras", oFont4 )
       oPrn:CmSay ( 5.2, 11.1, "Compras", oFont4 )
       oPrn:CmSay ( 5.7, 11.1, "La Calle, 22", oFont4 )
       oPrn:CmSay ( 6.7, 11.1, "Madrid", oFont4 )

       nFil :=  8.15
       nCol :=  2.20
       nTop :=  8.75
       nBot := 20.15
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Box ( nFil, nCol, nTop, nBot, oPen2 )           //Caja n§ fra. etc
       oPrn:CmSay ( 8.15,  2.30, 'C.I.F.:', oFont3 )
       oPrn:CmSay ( 8.15,  6.00, 'Nº Factura :', oFont3 )
       oPrn:CmSay ( 8.15, 11.20, 'Fecha : ', oFont3 )
       oPrn:CmSay ( 8.15, 15.60, 'F. Pago :', oFont3 )

       nFil :=  8.90
       nCol :=  2.20
       nTop :=  9.50
       nBot := 20.15
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Box ( nFil, nCol, nTop, nBot, oPen2 )           //Caja observaciones
       oPrn:CmSay ( 9.10, 2.30, 'Observaciones:', oFont2 )
       nFil :=  9.65
       nCol :=  2.20
       nTop := 23.25
       nBot := 20.15
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Box ( nFil, nCol, nTop, nBot, oPen2 )           //Caja cuerpo factura
       nFil :=  9.65
       nCol :=  5.20
       nTop := 23.25
       nBot :=  5.20
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )           //1¦ VERTICAL
       nFil :=  9.65
       nCol := 12.20
       nTop := 23.25
       nBot := 12.20
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )           //2¦ VERTICAL
       nFil :=  9.65
       nCol := 13.80
       nTop := 23.25
       nBot := 13.80
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )           //3¦ VERTICAL
       nFil :=  9.65
       nCol := 15.80
       nTop := 23.25
       nBot := 15.80
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )           //4¦ VERTICAL
       nFil :=  9.65
       nCol := 17.10
       nTop := 23.25
       nBot := 17.10
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )           //5¦ VERTICAL
       nFil := 10.20
       nCol :=  2.20
       nTop := 10.20
       nBot := 20.15
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )  // Subrayado HORIZONTAL
       oPrn:CmSay( 9.65,  2.30, 'Código'     , oFont3 )
       oPrn:CmSay( 9.65,  5.30, 'Descripción', oFont3 )
       oPrn:CmSay( 9.65, 12.30, 'Unid.'      , oFont3 )
       oPrn:CmSay( 9.65, 14.00, 'Precio'     , oFont3 )
//     oPrn:CmSay( 9.65, 16.20, 'Dto.'       , oFont3 )
       oPrn:CmSay( 9.65, 18.20, 'Importe'    , oFont3 )

       nFil := 23.40
       nCol :=  2.20
       nTop := 27.20
       nBot := 20.15
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Box ( nFil, nCol, nTop, nBot, oPen2 )           //Caja Final TOTALES

       oPrn:CmSay ( 23.50,   2.40, 'BASE', oFont7 )
       oPrn:CmSay ( 23.50,   5.20, '%IVA', oFont7 )
       oPrn:CmSay ( 23.50,   6.75, 'CUOTA', oFont7 )
       oPrn:CmSay ( 23.50,   9.60, '%RE', oFont7 )
       oPrn:CmSay ( 23.50,  11.20, 'CUOTA', oFont7 )
       oPrn:CmSay ( 23.50,  14.10, 'IMPORTE', oFont7 )

       nFil := 24.00
       nCol :=  2.20
       nTop := 24.00
       nBot := 16.70
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen1 )         //1¦ HORIZONT TOTALES

       nFil := 23.40
       nCol :=  4.95
       nTop := 26.20
       nBot :=  4.95
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen1 )         //1¦ VERTICAL TOTALES
       nFil := 23.40
       nCol :=  6.45
       nTop := 26.20
       nBot :=  6.45
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen1 )         //2¦ VERTICAL TOTALES
       nFil := 23.40
       nCol :=  9.35
       nTop := 26.20
       nBot :=  9.35
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen1 )         //3¦ VERTICAL TOTALES
       nFil := 23.40
       nCol := 10.95
       nTop := 26.20
       nBot := 10.95
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen1 )         //4¦ VERTICAL TOTALES
       nFil := 23.40
       nCol := 13.80
       nTop := 26.20
       nBot := 13.80
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen1 )         //5¦ VERTICAL TOTALES
       nFil := 23.40
       nCol := 16.65
       nTop := 26.20
       nBot := 16.65
       aCoord1 := oPrn:Cmtr2Pix( @nFil, @nCol )
       aCoord2 := oPrn:Cmtr2Pix( @nTop, @nBot )
       oPrn:Line ( nFil, nCol, nTop, nBot, oPen2 )         //6¦ VERTICAL TOTALES

       oPrn:CmSay ( 23.50, 16.95, 'SUMA BASES:', oFont6 )
       oPrn:CmSay ( 26.44,  2.40, 'TOTAL IVA:',     oFont6 )
       oPrn:CmSay ( 26.44,  7.70, 'TOTAL R.E.:',    oFont6 )
       oPrn:CmSay ( 26.44, 13.35, 'TOTAL FACTURA:', oFont4 )


   ENDPAGE

 ENDPRINT

 oFont1:End()
 oFont2:End()
 oFont3:End()
 oFont4:End()
 oFont5:End()
 oFont6:End()
 oFont7:End()
 oFont8:End()
 oFontLogo:End()
 oPen1:End()
 oPen2:End()

 Return NIL


Muy agradecida;))

Re: bugs FW14.06

Posted: Mon Jun 30, 2014 2:26 pm
by cnavarro
mastintin wrote:Puedes poner aqui el código de tu prueba de impresión a ver si reproduzco el error ? .
Si usas la ventana de preview completa en vez mdi te hace lo mismo ? .
Estoy interesado en el tema, a ver si estabilizamos el código .
Paraq empezar yo he puesto una DATA en rpreview.prg :

Code: Select all | Expand



DATA   lListViewHide INIT .t.

METHOD BuildListView() CLASS TPreview

   .....
  IF ::lListviewHide
      ::oLvw:Hide()
   endif
return nil

METHOD Zoom( lMenu ) CLASS TPreview

   DEFAULT lMenu := .F.

   ::lZoom := ! ::lZoom
   IF !::lListViewHide
      if IsWindowVisible( ::oLvw:hWnd )
         ::oLvw:Hide()
      else
         ::oLvw:Show()
      endif
   endif
   .....

METHOD ResizeListView() CLASS TPreview

IF !::lListviewHide

   ::oLvw:nHeight = ::oWnd:GetCliRect():nHeight - 2 - ;
                    If( ::oWnd:oBar != nil, ::oWnd:oBar:nHeight() - 2,;
                        ::oWnd:oTop:nHeight() ) - ;
                    If( ::oWnd:oMsgBar != nil, ::oWnd:oMsgBar:nHeight(),;
                        ::oWnd:oBottom:nHeight() )

   IF ::oLvw:nLeft == 0
      if ::oMeta1:nLeft <=  ::oLvw:nWidth
         ::olvw:hide()
      else
        ::olvw:show()
      endif
   else

      ::oLvw:nLeft :=  ::oWnd:GetCliRect():nWidth -  ::oLvw:nWidth

      if ::lTwoPages
          if ::oLvw:nLeft <= ::oMeta2:nRight
             ::oLvw:hide()
          else
             ::oLvw:show()
          endif
      else
         if ::oLvw:nLeft <= ::oMeta1:nRight
            ::oLvw:hide()
         else
            ::oLvw:show()
         endif
      endif
   endif

   ::oLvw:refresh()
endif

return nil

 


Manuel, yo también le estoy echando un vistazo

Re: bugs FW14.06

Posted: Mon Jun 30, 2014 4:43 pm
by mastintin
con este rpreview a mi me funciona bien https://dl.dropboxusercontent.com/u/132931/rpreview.prg mirar a ver .
Observar el primer botón ( una lupa) , permite ver o ocultar el listview y también tiene una data para quitar el menu si se quiere . Es la solución ya propuesta en mi anterior mensaje .
Tiene un pequeño bug que es que al cambiar el zoom ( con dobleclick ) también esta cambiando la visibilidad del listview , pero eso será fácil de solucionar.
Image