tdevdraw, libdraw: add display->dpi - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d0e0701913f3aede1fcb256f3d1e9c60c9af6edf
 (DIR) parent 7b9ef735a8d1fddf3887853abbd065271fa9c293
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Sun, 25 Nov 2012 21:41:52 -0500
       
       devdraw, libdraw: add display->dpi
       
       Fixed at 100 right now, but the plan is to make it accurate
       and then use it.
       
       R=rsc
       http://codereview.appspot.com/6856091
       
       Diffstat:
         M include/draw.h                      |       1 +
         M src/cmd/devdraw/devdraw.c           |      28 +++++++++++++++++++++++++++-
         M src/cmd/devdraw/devdraw.h           |       2 +-
         M src/libdraw/init.c                  |       9 +++++++++
       
       4 files changed, 38 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/include/draw.h b/include/draw.h
       t@@ -204,6 +204,7 @@ struct Display
                int                _isnewdisplay;
                struct Mux        *mux;
                int                srvfd;
       +        int                dpi;
        };
        
        struct Image
 (DIR) diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c
       t@@ -11,6 +11,7 @@
        #include "devdraw.h"
        
        extern void _flushmemscreen(Rectangle);
       +int displaydpi = 100;
        
        #define NHASH (1<<5)
        #define HASHMASK (NHASH-1)
       t@@ -776,6 +777,7 @@ _drawmsgwrite(void *v, int n)
                DName *dn;
                DScreen *dscrn;
                FChar *fc;
       +        Fmt fmt;
                Memimage *dst, *i, *l, **lp, *mask, *src;
                Memscreen *scrn;
                Point p, *pp, q, sp;
       t@@ -1083,7 +1085,31 @@ _drawmsgwrite(void *v, int n)
                                memmove(client->readdata, ibuf, ni);
                                client->nreaddata = ni;
                                client->infoid = -1;
       -                        continue;        
       +                        continue;
       +                
       +                /* query: 'Q' n[1] queryspec[n] */
       +                case 'q':
       +                        if(n < 2)
       +                                goto Eshortdraw;
       +                        m = 1+1+a[1];
       +                        if(n < m)
       +                                goto Eshortdraw;
       +                        fmtstrinit(&fmt);
       +                        for(c=0; c<a[1]; c++) {
       +                                switch(a[2+c]) {
       +                                default:
       +                                        err = "unknown query";
       +                                        goto error;
       +                                case 'd':        /* dpi */
       +                                        fmtprint(&fmt, "%11d ", displaydpi);
       +                                        break;
       +                                }
       +                        }
       +                        client->readdata = (uchar*)fmtstrflush(&fmt);
       +                        if(client->readdata == nil)
       +                                goto Enomem;
       +                        client->nreaddata = strlen((char*)client->readdata);
       +                        continue;
        
                        /* load character: 'l' fontid[4] srcid[4] index[2] R[4*4] P[2*4] left[1] width[1] */
                        case 'l':
 (DIR) diff --git a/src/cmd/devdraw/devdraw.h b/src/cmd/devdraw/devdraw.h
       t@@ -6,4 +6,4 @@ int parsewinsize(char*, Rectangle*, int*);
        int mouseswap(int);
        void abortcompose(void);
        
       -
       +extern int displaydpi;
 (DIR) diff --git a/src/libdraw/init.c b/src/libdraw/init.c
       t@@ -179,6 +179,15 @@ getimage0(Display *d, Image *image)
                image->clipr.min.y = atoi(info+9*12);
                image->clipr.max.x = atoi(info+10*12);
                image->clipr.max.y = atoi(info+11*12);
       +        
       +        a = bufimage(d, 3);
       +        a[0] = 'q';
       +        a[1] = 1;
       +        a[2] = 'd';
       +        d->dpi = 100;
       +        if(flushimage(d, 0) >= 0 && _displayrddraw(d, info, 12) == 12)
       +                d->dpi = atoi(info);
       +
                return image;
        }