Newsgroup: it.comp.lang.vo-clipper
Titolo: Stampa immagini in Clipper

Esiste una semplice libreria che consenta di stampare immagini BMP in un
classico tabulato generato da Clipper con istruzioni @ r,c say ?
Grazie

 wrote in message
kult7.7903$C15.1...@news.infostrada.it...


classico tabulato generato da Clipper con istruzioni @ r,c say ?
Ma intendi stampare su una laser o su una aghi ? Spiega un po' meglio
il risultato che vuoi ottenere ...
Ciao.Alberto.
-------------------------------------------------------------
Alberto Rubinelli           Mail : 
alb...@retrocomputing.net
A2 SISTEMI                  Http : 
www.retrocomputing.net
Via Costantino Perazzi 22   Tel 0321 640149
28100 NOVARA (NO) - ITALY   Fax 0321 391769
ICQ : 49872318              Odigo : 5269083

 wrote in message
1q1crt86ne6tqqptj...@4ax.com...


che consentono di inviare alla stampante un file BMP o qualcosa di simile.
Qualsiasi stampante ha comandi per stampare in grafica bitmap, inoltre
il formato BMP e' abbastanza semplice per cui fare un programma che
possa stampare BMP su stampanti, anche su diversi modelli, non e'
difficile.
La cosa si complica dovendo posizionare il bitmap in questione ed
eventualmente scalarlo etc.
In questo caso credo che la soluzione migliore sia quella di
appoggiarsi ad un sistema che possa gestire queste operazioni
automaticamente, ad esempio un "impaginatore" RTF o qualcosa del
genere.
ciao, acc.   
a...@libero.it

 ha scritto nel messaggio
news:kult7.7903$C15.1...@news.infostrada.it...



La libreria PageScript di AbeeLabs lo fa !!
www.abeelabs.com
Ciao
Paolo R.
paolo....@soft-com.it
www.soft-com.it

che consentono di inviare alla stampante un file BMP o qualcosa di simile.
Diverso tempo fa ho realizzato una funzione per la stampa di file B/N pcx su stampanti PCL5 (hp e
simili). Essendo scritta utilizzando solo le funzioni a basso livello di clipper, risulta un po'
lenta nella stampa di immagini grandi, ma per un logo puň andar bene. Se puň interessare, allego il
sorgente (scusate la lunghezza).
Saluti
*** Funzione ST_RASTER()
*** Serve per stampare files grafici codificati PCX su stampante LASER PCL5
*** Y-X = coordinate vertice alto a sinistra del rettangolo ove stampare
***       l'immagine in cm.
*** File = Variabile carattere che contiene il nome del files da stampare
***        preceduto da eventuale percorso di ricerca
*** Resol = Risoluzione in DPI per la stampa sulla LASER ("75"-"150"-"300")
*** T_st = tipo stampante (la funzione lavora solo con "L")
*** Cornice = Codice dell'eventuale cornice che deve bordare l'area di stampa
***           0=nessuna (DEFAULT) 1=sottile 2=medio 3=grosso 4=doppio 5=ombregg.
*** Y1-X1 = altezza e larghezza in cm dell'immagine raster da stampare (DEFAULT
***         stampa l'immagine nelle dimensioni originali altrimenti taglia
***         tutto cio' che deborda dalla cornice impostata).
*** inverti = se .t. inverte l'immagine convertendo i punti in bianco in punti
***         neri e viceversa DEFAULT .F.
Function st_raster(y,x,file,resol,t_st,cornice,y1,x1,inverti)
*** con modifiche potrebbe funzionare anche su deskject 500 (es: eliminazione
*** riquadro etc.)
local in_file,punti_x,punti_y,xx,over:=0
DEFAULT t_st TO "L",cornice TO 0,y1 TO 0,x1 TO 0,inverti TO .f.
if t_st="L"
   file=trim(file)
   in_file=fopen(file)
   *** posiziona il cursore per individuare l'angolo superiore sinistro
   ??i_posxy(y,x,t_st)
   if y1>0
      punti_y=ltrim(str(mis_punti(y1,1,val(resol)),4))
      ??chr(27)+"*r"+punti_y+"T"
   endif
   if x1>0
      punti_x=ltrim(str(mis_punti(x1,1,val(resol)),4))
      ??chr(27)+"*r"+punti_x+"S"
   endif
   if cornice>0.and.cornice<=5
      if cornice=1
         over=0.02
      elseif cornice=2.or.cornice=5
         over=0.04
      elseif cornice=3
         over=0.08
      elseif cornice=4
         *** doppio da fare
      endif
      xx=i_lbox(y-over,x-over,x1+over,y1+over,cornice,.t.,t_st)
   endif
   *** specifica la risoluzione in dpi
   ??chr(27)+"*t"+resol+"R"
   *** specifica il metodo di rappresentazione grafica (metodo normale a
   *** destra dell'angolo alto sinistro)
   ??chr(27)+"*r0F"
   *** specifica alla posizione corrente del cursore il margine sinistro
   ??chr(27)+"*r1A"
   xx=st_pcx(in_file,inverti)
   ??chr(27)+"*rB"
   if in_file>0
      xx=fclose(in_file)
   endif   
endif
return nil
*** Funzione ST_PCX()
*** effettua la decodifica e la stampa di un file in standard PCX
*** in_file = numero di accesso al file da stampare del Sistema Operativo
***           fornito dalla funzione fopen()
*** inverti = se .t. inverte il nero con il bianco in fase di decodifica
function st_pcx(in_file,inverti)
local xx,byte_r,buffer:=space(2),n,riga:="",num_righe,str_b,punto
DEFAULT inverti TO .f.
** Nei files di tipo PCX
** sposto il puntatore al byte 10. I bytes 11 e 12 contengono un intero 16 bit
** che contiene il numero di righe dell'immagine da decodificare
xx=fseek(in_file,10,0)
xx=fread(in_file,@buffer,2)
num_righe=bin2w(buffer)+1
** Nei files di tipo PCX
** sposto il puntatore al byte 66. I bytes 67 e 68 contengono un intero 16 bit
** che contiene la dimensione del buffer per memorizzare una riga decodificata
xx=fseek(in_file,66,0)
xx=fread(in_file,@buffer,2)
byte_r=bin2w(buffer)
str_b=str(byte_r)
*** vado all'inizio dei dati oltre l'intestazione del file PCX (128 byte)
punto=128
for n=1 to num_righe
   riga=dec_pcx(in_file,byte_r,@punto)
   *** stampo la singola riga decodificata
   ??chr(27)+"*b"+str_b+"W"+riga
next
return nil
*** Funzione DEC_PCX()
*** decodifica una riga del file pcx
Static function dec_pcx(in_file,byte_r,punto,inverti)
local byte_letto,xx,testo,riga:="",n:=1,buffer:=space(byte_r),prendi,car
DEFAULT inverti TO .f.
xx=fseek(in_file,punto,0)
byte_letto=fread(in_file,@buffer,byte_r)
prendi=1
do while n<=byte_r
   *** leggo il byte chiave
   car=substr(buffer,prendi,1)
   xx=asc(car)-192 // solo se il valore del codice ascii e'> di 192 (11000000)
                   // i primi due bit sono entrambi ad 1
                   // se il byte comincia con due bit a 1 e' indicativo di
                   // carattere codice (i successivi sei bit mi indicano le
                   // volte che devo ripetere il byte seguente)
   if xx>0
      testo=substr(buffer,prendi+1,1)
      testo=if(inverti,testo,chr(255-asc(testo)))
      riga=riga+repl(testo,xx)
      n=n+xx
      punto=punto+2
      prendi=prendi+2
   else
      car=if(inverti,car,chr(255-asc(car)))
      riga=riga+car
      n=n+1
      punto=punto+1
      prendi=prendi+1
   endif
enddo
return riga

lenta
Per certe cose meglio C o ASM.
ciao, acc.   
a...@libero.it


Beh grazie per la disponibilità di postare il tuo codice.
L'ho provato, ma CLipper mi chiede le tre seguenti funzioni:
I_POSXY
MIS_PUNTI
I_LBOX
Fanno forse parte di qualche LIB ?
Grazie per ogni risposta.
LUIGI


Effettivamente il sorgente che ho allegato al messaggio non contiene la definizione delle funzioni
che hai indicato. Sono funzioni per "muoversi" all'interno della pagina della stampante laser (pcl5)
con riferiementi in cm, pollici o punti tipografici ed altre per la stampa di box, righe etc. In
questo tipo di gestione della stampa il riferimento alla "riga di stampa" tipico dei report con
Clipper, non ha più significato (si può tracciare prima un box infondo alla pagina e poi spostarsi
in alto e scrivere del testo etc., solo quando l'intera pagina è terminata, la si invia in stampa)
Ecco i sorgenti di queste funzioni (costate tanta fatica ed utilizzate con successo da tanti
anni...)
*** Funzione I_POSXY()
*** Serve per posizionare il cursore della laser alle coordinate x,y
*** rispetto al vertice del foglio (scorporando i margini)
*** m_y  = coordinata y del vertice (riga)
*** m_x  = coordinata x del vertice
*** t_st = tipo stampante
function I_POSXY(m_y,m_x,t_st)
*** ok descject 500
local rit_rno
rit_rno=i_posy(m_y,t_st)+i_posx(m_x,t_st)
return rit_rno
*** Funzione I_POSX()
*** Serve per impostare una posizione ASSOLUTA o RELATIVA partendo dal bordo
*** sinistro del foglio A4 (considerando il margine eventualmente definito).
*** Funziona solo con la stampante laser impostata a 300 d.p.i.
*** Posi = cm pollici o punti tipografici a destra del margine sinistro
***        nel quale posizionare il cursore di stampa.
*** Stam = tipo di stampante (default "L").
*** St   = 0 accetta posi in punti tipografici
***      = 1 accetta posi in cm (DEFAULT)
***      = 2 accetta posi in pollici
*** lato = "" lo spostamento e' assoluto dal margine sinistro DEFAULT
***      = "+" lo spostamento e' relativo dalla posiz. corrente verso destra
***      = "-" lo spostamento e' relativo dalla posiz. corrente verso sinistra
*************
FUNCTION i_posx(posi,stam,st,lato)
*** ok deskject 500
local rit_rno
DEFAULT stam TO "L",st TO 1,lato TO ""
if stam="L"
   posi=mis_punti(posi,st,300)
   posi=ltrim(str(posi,10))
   *****************
   posi=lato+posi
   rit_rno=chr(27)+chr(042)+chr(112)+posi+chr(088)
else
   rit_rno=chr(K_TAB)   // tabulazione
endif
return rit_rno
*** Funzione I_POSY()
*** Serve per impostare una posizione ASSOLUTA o RELATIVA partendo dal bordo
*** ALTO del foglio A4 (considerando il margine eventualmente definito).
*** Funziona solo con la stampante laser impostata a 300 d.p.i.
*** Posi = cm pollici o punti tipografici in basso rispetto al margine
***        superiore nel quale posizionare il cursore di stampa.
*** Stam = tipo di stampante (default "L").
*** St   = 0 accetta posi in punti tipografici
***      = 1 accetta posi in cm (DEFAULT)
***      = 2 accetta posi in pollici
*** lato = "" spostamento assoluto rispetto al margine superiore  DEFAULT
***      = "+" spostamento verso il basso dalla posizione corrente
*** lato = "-" spostamento verso l'alto dalla posizione corrente
*************
FUNCTION i_posy(posi,stam,st,lato)
*** ok deskject 500
local rit_rno
DEFAULT stam TO "L",st TO 1,lato TO ""
if stam="L"
   posi=mis_punti(posi,st,300)
   posi=ltrim(str(posi,10))
   *****************
   rit_rno=chr(27)+chr(042)+chr(112)+posi+chr(089)
else
   rit_rno=chr(K_ENTER)+chr(10)   // invio a capo
endif
return rit_rno
*** Funzione MIS_PUNTI
*** Converte misure in centimetri in misure a punti
*** mis  = misura lineare da convertire (in pollici o cm)
*** modo = 1 -> ingresso in cm DEFAULT
***      = 2 -> ingresso in pollici
***      = 3 -> ingressso in punti ed uscita in cm
*** dpi  = densita' di settaggio della stampante laser  DEFAULT = 300
Function mis_punti(mis,modo,dpi)
local posi
DEFAULT modo TO 1, dpi TO 300
if modo=1
   posi=mis*0.3937*dpi  // 1 cm = 0.3937 inch  1 inch = 2,54 cm
*   posi=ltrim(str(posi,10))
elseif modo=2
   posi=posi*dpi
*   posi=ltrim(str(posi,10))
elseif modo=3
   posi=(mis/dpi*2.54)
endif
return posi
*** Funzione I_LBOX
*** Serve per tracciare dei box con la stampante LASER all'interno dei quali
*** inserire del testo (testo incorniciato)
*** m_x  = distanza dal BORDO SINISTRO del foglio ove posizionare il vertice
***        superiore sinistro del box (in CM)
*** m_y  = distanza dal BORDO SUPERIORE del foglio ove posizionare il vertice
***        superiore sinistro del box (in CM)
*** m_l  = larghezza del box da costruire (in CM)
*** m_h  = altezza del box da costruire (in CM)
*** tipo = tipo del contorno del box da costruire 1 = sottile 2 = medio (default)
***        3 = grosso 4 = doppio riquadro   5 = ombreggiato  6 = interamente nero
*** tras = trasparente o non trasparente (NON IMPLEMENTATO)
*** t_st = "L" = Laser (DEFAULT) per altre stampanti si disattiva
*******************
Function I_LBOX(m_y,m_x,m_l,m_h,tipo,tras,t_st)
*** NO DESKJECT 500
local xx,largo,alto,meno,spesso
DEFAULT tipo TO 2, tras TO .f., t_st TO "L"
*** converto le misure in punti
if t_st="L"
   m_l=mis_punti(m_l,1,300)
   largo=ltrim(str(m_l,10))
   m_h=mis_punti(m_h,1,300)
   alto=ltrim(str(m_h,10))
   if tipo=5
      ??i_posx(m_x+0.2)
      ??I_posy(m_y+0.2)
      *** ombreggiatura
      *** dimensiono il rettangolo esterno dell'ombra
      ??chr(27)+chr(042)+chr(099)+largo+chr(065)
      ??chr(27)+chr(042)+chr(099)+alto+chr(066)
      *** imposto riempimento nero pieno
      ??chr(27)+chr(042)+chr(099)+chr(048)+chr(080)
      *** per settare un bordo di medio spessore
      tipo=2
   endif
   *** imposto box primario
   ??i_posx(m_x)
   ??i_posy(m_y)
   *** dimensiono il rettangolo primario
   ??chr(27)+chr(042)+chr(099)+largo+chr(065)
   ??chr(27)+chr(042)+chr(099)+alto+chr(066)
   *** imposto riempimento nero pieno
   ??chr(27)+chr(042)+chr(099)+chr(048)+chr(080)
   if tipo<>6
      *** dimensiono il rettangolo interno da schiarire
      do case
         case tipo=1
              *** sottile
              spesso=0.02
         case tipo=2
              *** medio
              spesso=0.04
         case tipo=3
              *** grosso
              spesso=0.08
         case tipo=4
              *** doppio
      endcase
      ??i_posx(m_x+spesso)
      ??i_posy(m_y+spesso)
      meno=mis_punti(spesso+spesso)
      *** definisco il rettangolo
      ??chr(27)+chr(042)+chr(099)+ltrim(str(m_l-meno,10))+chr(065)
      ??chr(27)+chr(042)+chr(099)+ltrim(str(m_h-meno,10))+chr(066)
      *** cancello il riempimento pieno
      ??chr(27)+chr(042)+chr(099)+chr(049)+chr(080)
   endif
endif
return nil
*** Funzione I_LVLIN()
*** Serve per tracciare linee verticali
*** m_y  = coordinata y vertice di partenza
*** m_x  = coordinata x vertice di partenza
*** m_l  = lunghezza del tratto
*** tipo = spessore del tratto 1=sottile (2mm) 2=medio (4mm) 3=spesso (8mm)
*** t_st = tipo stampante "L" = Laser altre stampanti disattivano la funzione
Function I_LVLIN(m_y,m_x,m_l,tipo,t_st)
*** NO DESKJECT 500
local xx,largo
DEFAULT t_st TO "L"
if t_st="L"
   do case
      case tipo=1
           largo=0.02
      case tipo=2
           largo=0.04
      case tipo=3
           largo=0.08
   endcase
   xx=i_lbox(m_y,m_x,largo,m_l,6)
endif
return nil
*** Funzione I_LOLIN()
*** Serve per tracciare linee orizzontali
*** m_y  = coordinata y vertice di partenza
*** m_x  = coordinata x vertice di partenza
*** m_l  = lunghezza del tratto
*** tipo = spessore del tratto 1=sottile (2mm) 2=medio (4mm) 3=spesso (8mm)
*** t_st = tipo stampante "L" = Laser altre stampanti disattivano la funzione
Function I_LOLIN(m_y,m_x,m_l,tipo,t_st)
*** NO DESKJECT 500
local xx,largo
DEFAULT t_st TO "L"
if t_st="L"
   do case
      case tipo=1
           largo=0.02
      case tipo=2
           largo=0.04
      case tipo=3
           largo=0.08
   endcase
   xx=i_lbox(m_y,m_x,m_l,largo,6)
endif
return nil
*** Funzione I_CAMP()
*** Serve per definire una campitura di fondo
*** m_x  = distanza dal BORDO SINISTRO del foglio ove posizionare il vertice
***        superiore sinistro del box (in CM)
*** m_y  = distanza dal BORDO SUPERIORE del foglio ove posizionare il vertice
***        superiore sinistro del box (in CM)
*** m_l  = larghezza del box da costruire (in CM)
*** m_h  = altezza del box da costruire (in CM)
*** tipo = tipo della campitura.
***        tipo = 1 riempimento con ombreggatura
***        tipo = 2 riempimento con campitura (reticoli di linee)
***        tipo = 3 come tipo 1 ma con riquadro nero (DEFAULT)
***        tipo = 4 come tipo 2 ma con riquadro nero
***        tipo = 5 come tipo 3 ma con anche l'ombra
***        tipo = 6 come tipo 4 ma con anche l'ombra
*** modo = tipo = 1/3 modo = 2 / 10 / 15 / 30 / 45 / 70 / 90  % di grigio
***                          quelle sopra elencati sono le uniche % accettate!!
***                          DEFAULT modo = 30
***        tipo = 2/4 modo = 1 una linea orizzontale
***                   modo = 2 due linee verticali
***                   modo = 3 tre linee diagonali
***                   modo = 4 quattro linee diagonali
***                   modo = 5 griglia quadrata
***                   modo = 6 griglia diagonale
*** t_st = sigla della stampante "L" = Laser le altre disattivano la funzione
*********
Function i_camp(m_y,m_x,m_l,m_h,tipo,modo,t_st)
*** NO DESKJECT 500
local tp,largo,alto,mm_l,mm_h,xx,riq
DEFAULT tipo TO 3, modo TO 30, t_st TO "L"
if t_st="L"
   if tipo>2
      *** disegna il riquadro
      if tipo=3.or.tipo=4
         *** senza ombra
         riq=2
      else
         *** ombreggiato
         riq=5
      endif
      xx=i_lbox(m_y,m_x,m_l,m_h,riq)
      * ridimensiono il box per la campitura 0.02 e' lo spessore in cm del bordo
      m_y=m_y+0.02
      m_x=m_x+0.02
      m_l=m_l-0.04
      m_h=m_h-0.04
   endif
   mm_l=mis_punti(m_l,1,300)
   largo=ltrim(str(mm_l,10))
   mm_h=mis_punti(m_h,1,300)
   alto=ltrim(str(mm_h,10))
   if tipo=1.or.tipo=3
      *** tp = % di grigio
      tp=ltrim(str(modo,2))
      ??chr(27)+chr(042)+chr(099)+tp+chr(071)
   elseif tipo=2.or.tipo=4
      tp=str(modo,1)
      ??chr(27)+chr(042)+chr(099)+tp+chr(071)
   endif
   ??i_posx(m_x)
   ??I_posy(m_y)
   ??chr(27)+chr(042)+chr(099)+largo+chr(065)
   ??chr(27)+chr(042)+chr(099)+alto+chr(066)
   if tipo=1.or.tipo=3
      *** riempio con ombreggiatura
      ??chr(27)+chr(042)+chr(099)+chr(050)+chr(080)
   elseif tipo=2.or.tipo=4
      *** riempio con campitura
      ??chr(27)+chr(042)+chr(099)+chr(051)+chr(080)
   endif
endif
return nil
Saluti, Marino Vignoli

Che dire ...
Grazie infinite!
Luigi Dorigo


 Grazie infinite!
Scusa, solo un piccolo rimprovero: hai scritto due righe di messaggio e
poi un botto di righe di quoting. La prossima volta stai più attento.
EMG
-----------------------------------
EMAG Software homepage
http://www.emagsoftware.it
The EMG's ZX-Spectrum Software Page
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games
http://www.emagsoftware.it/tbosg

Giusta osservazione!
Scusatemi tutti.
Luigi Dorigo
