File:  [WindowsNT SDKs] / ntddk / src / video / displays / vga / gdiinfo.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Thu Aug 9 18:31:12 2018 UTC (7 years, 9 months ago) by root
Branches: msft, MAIN
CVS tags: ntddk-nov-1993, HEAD
Microsoft Windows NT Build 511 (DDK SDK) 11-01-1993

/******************************Module*Header*******************************\
* Module Name: gdiinfo.c
*
* This contains the static data structures in the VGA driver.
*
* Copyright (c) 1992 Microsoft Corporation
\**************************************************************************/


#include "driver.h"


/******************************Public*Data*Struct*************************\
* This contains the GDIINFO structure that contains the device capabilities
* which are passed to the NT GDI engine during dhpdevEnablePDEV.
*
\**************************************************************************/

GDIINFO gaulCap = {

     0x1000,                // ulVersion (our driver is version 1.000)
     DT_RASDISPLAY,         // ulTechnology
     240,                   // ulHorzSize
     180,                   // ulVertSize
     0,                     // ulHorzRes (filled in at initialization)
     0,                     // ulVertRes (filled in at initialization)
     4,                     // cBitsPixel
     1,                     // cPlanes
     16,                    // ulNumColors
     0,                     // flRaster (DDI reserved field)

     0,                     // ulLogPixelsX (filled in at initialization)
     0,                     // ulLogPixelsY (filled in at initialization)

     TC_RA_ABLE | TC_SCROLLBLT,  // flTextCaps

     6,                     // ulDACRed
     6,                     // ulDACGree
     6,                     // ulDACBlue

     0x0024,                // ulAspectX  (one-to-one aspect ratio)
     0x0024,                // ulAspectY
     0x0033,                // ulAspectXY

     1,                     // xStyleStep
     1,                     // yStyleSte;
     3,                     // denStyleStep

     { 0, 0 },              // ptlPhysOffset
     { 0, 0 },              // szlPhysSize

     0,                     // ulNumPalReg (win3.1 16 color drivers say 0 too)

// These fields are for halftone initialization.

     {                                          // ciDevice, ColorInfo
        { 6700, 3300, 0 },                      // Red
        { 2100, 7100, 0 },                      // Green
        { 1400,  800, 0 },                      // Blue
        { 1750, 3950, 0 },                      // Cyan
        { 4050, 2050, 0 },                      // Magenta
        { 4400, 5200, 0 },                      // Yellow
        { 3127, 3290, 0 },                      // AlignmentWhite
        20000,                                  // RedGamma
        20000,                                  // GreenGamma
        20000,                                  // BlueGamma
        0, 0, 0, 0, 0, 0
     },

     0,                      // ulDevicePelsDPI  (filled in at initialization)
     PRIMARY_ORDER_CBA,                         // ulPrimaryOrder
     HT_PATSIZE_4x4_M,                          // ulHTPatternSize
     HT_FORMAT_4BPP_IRGB,                       // ulHTOutputFormat
     HT_FLAG_ADDITIVE_PRIMS                     // flHTFlags

};

/******************************Public*Data*Struct*************************\
* LOGPALETTE
*
* This is the palette for the VGA.
*
\**************************************************************************/

// Little bit of hacking to get this to compile happily.

typedef struct _VGALOGPALETTE
{
    USHORT ident;
    USHORT NumEntries;
    PALETTEENTRY palPalEntry[16];
} VGALOGPALETTE;

const VGALOGPALETTE logPalVGA =
{

0x400,  // driver version
16,     // num entries
{
    { 0,   0,   0,   0 },       // 0
    { 0x80,0,   0,   0 },       // 1
    { 0,   0x80,0,   0 },       // 2
    { 0x80,0x80,0,   0 },       // 3
    { 0,   0,   0x80,0 },       // 4
    { 0x80,0,   0x80,0 },       // 5
    { 0,   0x80,0x80,0 },       // 6
    { 0x80,0x80,0x80,0 },       // 7

    { 0xC0,0xC0,0xC0,0 },       // 8
    { 0xFF,0,   0,   0 },       // 9
    { 0,   0xFF,0,   0 },       // 10
    { 0xFF,0xFF,0,   0 },       // 11
    { 0,   0,   0xFF,0 },       // 12
    { 0xFF,0,   0xFF,0 },       // 13
    { 0,   0xFF,0xFF,0 },       // 14
    { 0xFF,0xFF,0xFF,0 }        // 15
}
};


/******************************Public*Routine******************************\
* DEVINFO
*
* This is the devinfo structure passed back to the engine in DrvEnablePDEV
*
\**************************************************************************/

#define SYSTM_LOGFONT {16,7,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"System"}
#define HELVE_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,VARIABLE_PITCH | FF_DONTCARE,  L"MS Sans Serif"}
#define COURI_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE,    L"Courier"}

DEVINFO devinfoVGA =
{
    (GCAPS_OPAQUERECT | GCAPS_HORIZSTRIKE | GCAPS_ALTERNATEFILL | GCAPS_MONO_DITHER | GCAPS_COLOR_DITHER |
     GCAPS_WINDINGFILL | GCAPS_TRAPPAINT),       // Graphics capabilities
    SYSTM_LOGFONT,  // Default font description
    HELVE_LOGFONT,  // ANSI variable font description
    COURI_LOGFONT,  // ANSI fixed font description
    0,              // Count of device fonts
    BMF_4BPP,       // preferred DIB format
    8,              // Width of color dither
    8,              // Height of color dither
    0               // Default palette to use for this device
};

/******************************Public*Data*Struct*************************\
* gaajPat
*
* These are the standard patterns defined Windows, they are used to produce
* hatch brushes, grey brushes etc.
*
\**************************************************************************/

BYTE gaajPat[HS_DDI_MAX][32] = {

    { 0x00,0x00,0x00,0x00,                 // ........     HS_HORIZONTAL 0
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0xff,0x00,0x00,0x00,                 // ********
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00 },               // ........

    { 0x08,0x00,0x00,0x00,                 // ....*...     HS_VERTICAL 1
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00 },               // ....*...

    { 0x80,0x00,0x00,0x00,                 // *.......     HS_FDIAGONAL 2
      0x40,0x00,0x00,0x00,                 // .*......
      0x20,0x00,0x00,0x00,                 // ..*.....
      0x10,0x00,0x00,0x00,                 // ...*....
      0x08,0x00,0x00,0x00,                 // ....*...
      0x04,0x00,0x00,0x00,                 // .....*..
      0x02,0x00,0x00,0x00,                 // ......*.
      0x01,0x00,0x00,0x00 },               // .......*

    { 0x01,0x00,0x00,0x00,                 // .......*     HS_BDIAGONAL 3
      0x02,0x00,0x00,0x00,                 // ......*.
      0x04,0x00,0x00,0x00,                 // .....*..
      0x08,0x00,0x00,0x00,                 // ....*...
      0x10,0x00,0x00,0x00,                 // ...*....
      0x20,0x00,0x00,0x00,                 // ..*.....
      0x40,0x00,0x00,0x00,                 // .*......
      0x80,0x00,0x00,0x00 },               // *.......

    { 0x08,0x00,0x00,0x00,                 // ....*...     HS_CROSS 4
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0xff,0x00,0x00,0x00,                 // ********
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00,                 // ....*...
      0x08,0x00,0x00,0x00 },               // ....*...

    { 0x81,0x00,0x00,0x00,                 // *......*     HS_DIAGCROSS 5
      0x42,0x00,0x00,0x00,                 // .*....*.
      0x24,0x00,0x00,0x00,                 // ..*..*..
      0x18,0x00,0x00,0x00,                 // ...**...
      0x18,0x00,0x00,0x00,                 // ...**...
      0x24,0x00,0x00,0x00,                 // ..*..*..
      0x42,0x00,0x00,0x00,                 // .*....*.
      0x81,0x00,0x00,0x00 },               // *......*

    { 0x81,0x00,0x00,0x00,                 // *......*     HS_FDIAGONAL1 6
      0x60,0x00,0x00,0x00,                 // .**.....
      0x18,0x00,0x00,0x00,                 // ...**...
      0x06,0x00,0x00,0x00,                 // .....**.
      0x81,0x00,0x00,0x00,                 // *......*
      0x60,0x00,0x00,0x00,                 // .**.....
      0x18,0x00,0x00,0x00,                 // ...**...
      0x06,0x00,0x00,0x00 },               // .....**.

    { 0x81,0x00,0x00,0x00,                 // *......*     HS_BDIAGONAL1 7
      0x06,0x00,0x00,0x00,                 // .....**.
      0x18,0x00,0x00,0x00,                 // ...**...
      0x60,0x00,0x00,0x00,                 // .**.....
      0x81,0x00,0x00,0x00,                 // *......*
      0x06,0x00,0x00,0x00,                 // .....**.
      0x18,0x00,0x00,0x00,                 // ...**...
      0x60,0x00,0x00,0x00 },               // .**.....

    { 0xFF,0x00,0x00,0x00,                 // ********     HS_SOLID 8
      0xFF,0x00,0x00,0x00,                 // ********
      0xFF,0x00,0x00,0x00,                 // ********
      0xFF,0x00,0x00,0x00,                 // ********
      0xFF,0x00,0x00,0x00,                 // ********
      0xFF,0x00,0x00,0x00,                 // ********
      0xFF,0x00,0x00,0x00,                 // ********
      0xFF,0x00,0x00,0x00 },               // ********

    { 0x38,0x00,0x00,0x00,                 // ..***...     HS_DENSE1 9
      0x7c,0x00,0x00,0x00,                 // .*****..
      0x7c,0x00,0x00,0x00,                 // .*****..
      0x38,0x00,0x00,0x00,                 // ..***...
      0x83,0x00,0x00,0x00,                 // *.....**
      0xc7,0x00,0x00,0x00,                 // **...***
      0xc7,0x00,0x00,0x00,                 // **...***
      0x83,0x00,0x00,0x00 },               // *.....**

    { 0x38,0x00,0x00,0x00,                 // ..***...     HS_DENSE2 10
      0x6c,0x00,0x00,0x00,                 // .**.**..
      0x54,0x00,0x00,0x00,                 // .*.*.*..
      0x38,0x00,0x00,0x00,                 // ..***...
      0x83,0x00,0x00,0x00,                 // *.....**
      0xc6,0x00,0x00,0x00,                 // **...**.
      0x45,0x00,0x00,0x00,                 // .*...*.*
      0x83,0x00,0x00,0x00 },               // *.....**

    { 0x18,0x00,0x00,0x00,                 // ...**...     HS_DENSE3 11
      0x3c,0x00,0x00,0x00,                 // ..****..
      0x34,0x00,0x00,0x00,                 // ..**.*..
      0x18,0x00,0x00,0x00,                 // ...**...
      0x81,0x00,0x00,0x00,                 // *......*
      0xc3,0x00,0x00,0x00,                 // **....**
      0x43,0x00,0x00,0x00,                 // .*....**
      0x81,0x00,0x00,0x00 },               // *......*

    { 0x18,0x00,0x00,0x00,                 // ...**...     HS_DENSE4 12
      0x2c,0x00,0x00,0x00,                 // ..*.**..
      0x24,0x00,0x00,0x00,                 // ..*..*..
      0x18,0x00,0x00,0x00,                 // ...**...
      0x81,0x00,0x00,0x00,                 // *......*
      0xc1,0x00,0x00,0x00,                 // **....*.
      0x42,0x00,0x00,0x00,                 // .*....*.
      0x81,0x00,0x00,0x00 },               // *......*

    { 0x10,0x00,0x00,0x00,                 // ...*....     HS_DENSE5 13
      0x38,0x00,0x00,0x00,                 // ..***...
      0x28,0x00,0x00,0x00,                 // ..*.*...
      0x10,0x00,0x00,0x00,                 // ...*....
      0x01,0x00,0x00,0x00,                 // .......*
      0x83,0x00,0x00,0x00,                 // *.....**
      0x82,0x00,0x00,0x00,                 // *.....*.
      0x01,0x00,0x00,0x00 },               // .......*

    { 0x00,0x00,0x00,0x00,                 // ........     HS_DENSE6 14
      0x10,0x00,0x00,0x00,                 // ...*....
      0x38,0x00,0x00,0x00,                 // ..***...
      0x10,0x00,0x00,0x00,                 // ...*....
      0x00,0x00,0x00,0x00,                 // ........
      0x01,0x00,0x00,0x00,                 // .......*
      0x83,0x00,0x00,0x00,                 // *.....**
      0x01,0x00,0x00,0x00 },               // .......*

    { 0x00,0x00,0x00,0x00,                 // ........     HS_DENSE7 15
      0x10,0x00,0x00,0x00,                 // ...*....
      0x30,0x00,0x00,0x00,                 // ..**....
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x01,0x00,0x00,0x00,                 // .......*
      0x03,0x00,0x00,0x00,                 // ......**
      0x00,0x00,0x00,0x00 },               // ........

    { 0x00,0x00,0x00,0x00,                 // ........     HS_DENSE8 16
      0x00,0x00,0x00,0x00,                 // ........
      0x20,0x00,0x00,0x00,                 // ..*.....
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x02,0x00,0x00,0x00,                 // ......*.
      0x00,0x00,0x00,0x00 },               // ........

    { 0x00,0x00,0x00,0x00,                 // ........     HS_NOSHADE 17
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00,                 // ........
      0x00,0x00,0x00,0x00 },               // ........

    { 0xAA,0x00,0x00,0x00,                 // *.*.*.*.     HS_HALFTONE 18
      0x55,0x00,0x00,0x00,                 // .*.*.*.*
      0xAA,0x00,0x00,0x00,                 // *.*.*.*.
      0x55,0x00,0x00,0x00,                 // .*.*.*.*
      0xAA,0x00,0x00,0x00,                 // *.*.*.*.
      0x55,0x00,0x00,0x00,                 // .*.*.*.*
      0xAA,0x00,0x00,0x00,                 // *.*.*.*.
      0x55,0x00,0x00,0x00 }                // .*.*.*.*
};

// We pre-realize all of our hatch brushes here.

BYTE gaajRealizedPat[HS_DDI_MAX][32] = {

    { 0x00,0x00,                 // ........     HS_HORIZONTAL 0
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0xff,0xff,                 // ********
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00},                // ........

    { 0x08,0x08,                 // ....*...     HS_VERTICAL 1
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08},                // ....*...

    { 0x80,0x80,                 // *.......     HS_FDIAGONAL 2
      0x40,0x40,                 // .*......
      0x20,0x20,                 // ..*.....
      0x10,0x10,                 // ...*....
      0x08,0x08,                 // ....*...
      0x04,0x04,                 // .....*..
      0x02,0x02,                 // ......*.
      0x01,0x01},                // .......*

    { 0x01,0x01,                 // .......*     HS_BDIAGONAL 3
      0x02,0x02,                 // ......*.
      0x04,0x04,                 // .....*..
      0x08,0x08,                 // ....*...
      0x10,0x10,                 // ...*....
      0x20,0x20,                 // ..*.....
      0x40,0x40,                 // .*......
      0x80,0x80},                // *.......

    { 0x08,0x08,                 // ....*...     HS_CROSS 4
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0xff,0xff,                 // ********
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08,                 // ....*...
      0x08,0x08},                // ....*...

    { 0x81,0x81,                 // *......*     HS_DIAGCROSS 5
      0x42,0x42,                 // .*....*.
      0x24,0x24,                 // ..*..*..
      0x18,0x18,                 // ...**...
      0x18,0x18,                 // ...**...
      0x24,0x24,                 // ..*..*..
      0x42,0x42,                 // .*....*.
      0x81,0x81},                // *......*

    { 0x81,0x81,                 // *......*     HS_FDIAGONAL1 6
      0x60,0x60,                 // .**.....
      0x18,0x18,                 // ...**...
      0x06,0x06,                 // .....**.
      0x81,0x81,                 // *......*
      0x60,0x60,                 // .**.....
      0x18,0x18,                 // ...**...
      0x06,0x06},                // .....**.

    { 0x81,0x81,                 // *......*     HS_BDIAGONAL1 7
      0x06,0x06,                 // .....**.
      0x18,0x18,                 // ...**...
      0x60,0x60,                 // .**.....
      0x81,0x81,                 // *......*
      0x06,0x06,                 // .....**.
      0x18,0x18,                 // ...**...
      0x60,0x60},                // .**.....

    { 0xFF,0xFF,                 // ********     HS_SOLID 8
      0xFF,0xFF,                 // ********
      0xFF,0xFF,                 // ********
      0xFF,0xFF,                 // ********
      0xFF,0xFF,                 // ********
      0xFF,0xFF,                 // ********
      0xFF,0xFF,                 // ********
      0xFF,0xFF},                // ********

    { 0x38,0x38,                 // ..***...     HS_DENSE1 9
      0x7c,0x7c,                 // .*****..
      0x7c,0x7c,                 // .*****..
      0x38,0x38,                 // ..***...
      0x83,0x83,                 // *.....**
      0xc7,0xc7,                 // **...***
      0xc7,0xc7,                 // **...***
      0x83,0x83},                // *.....**

    { 0x38,0x38,                 // ..***...     HS_DENSE2 10
      0x6c,0x6c,                 // .**.**..
      0x54,0x54,                 // .*.*.*..
      0x38,0x38,                 // ..***...
      0x83,0x83,                 // *.....**
      0xc6,0xc6,                 // **...**.
      0x45,0x45,                 // .*...*.*
      0x83,0x83},                // *.....**

    { 0x18,0x18,                 // ...**...     HS_DENSE3 11
      0x3c,0x3c,                 // ..****..
      0x34,0x34,                 // ..**.*..
      0x18,0x18,                 // ...**...
      0x81,0x81,                 // *......*
      0xc3,0xc3,                 // **....**
      0x43,0x43,                 // .*....**
      0x81,0x81},                // *......*

    { 0x18,0x18,                 // ...**...     HS_DENSE4 12
      0x2c,0x2c,                 // ..*.**..
      0x24,0x24,                 // ..*..*..
      0x18,0x18,                 // ...**...
      0x81,0x81,                 // *......*
      0xc1,0xc1,                 // **....*.
      0x42,0x42,                 // .*....*.
      0x81,0x81},                // *......*

    { 0x10,0x10,                 // ...*....     HS_DENSE5 13
      0x38,0x38,                 // ..***...
      0x28,0x28,                 // ..*.*...
      0x10,0x10,                 // ...*....
      0x01,0x01,                 // .......*
      0x83,0x83,                 // *.....**
      0x82,0x82,                 // *.....*.
      0x01,0x01},                // .......*

    { 0x00,0x00,                 // ........     HS_DENSE6 14
      0x10,0x10,                 // ...*....
      0x38,0x38,                 // ..***...
      0x10,0x10,                 // ...*....
      0x00,0x00,                 // ........
      0x01,0x01,                 // .......*
      0x83,0x83,                 // *.....**
      0x01,0x01},                // .......*

    { 0x00,0x00,                 // ........     HS_DENSE7 15
      0x10,0x10,                 // ...*....
      0x30,0x30,                 // ..**....
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x01,0x01,                 // .......*
      0x03,0x03,                 // ......**
      0x00,0x00},                // ........

    { 0x00,0x00,                 // ........     HS_DENSE8 16
      0x00,0x00,                 // ........
      0x20,0x20,                 // ..*.....
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x02,0x02,                 // ......*.
      0x00,0x00},                // ........

    { 0x00,0x00,                 // ........     HS_NOSHADE 17
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00,                 // ........
      0x00,0x00},                // ........

    { 0xAA,0xAA,                 // *.*.*.*.     HS_HALFTONE 18
      0x55,0x55,                 // .*.*.*.*
      0xAA,0xAA,                 // *.*.*.*.
      0x55,0x55,                 // .*.*.*.*
      0xAA,0xAA,                 // *.*.*.*.
      0x55,0x55,                 // .*.*.*.*
      0xAA,0xAA,                 // *.*.*.*.
      0x55,0x55}                 // .*.*.*.*
};

// DrvRealizeBrush uses this table to get to the pre-realized version of
// The hatched brush. The first number is the "real" width. The second
// number is the number of bits one must shift right to divide a y coord
// by the height of this brush (power of 2 divisor). This allows us to quickly
// figure out how many passes are in our venetian blind.  For example, the
// HS_VERTICAL brush is really one scan line (0x8) repeated 8 times. We
// view this as a 1 high pattern. This will result in a one pass blt. The
// HS_HALFTONE brush is really a repeating 2 high pattern. So we can do this
// in two passes. Most of the other hatches are 8 high so we will have to
// venetian blind our pattern to the screen with 8 passes.

ULONG gRealizedBrushHeight[] = {
    8, 3,//HS_HORIZONTAL 0
    1, 0,//HS_VERTICAL 1
    8, 3,//HS_FDIAGONAL 2
    8, 3,//HS_BDIAGONAL 3
    8, 3,//HS_CROSS 4
    8, 3,//HS_DIAGCROSS 5
    8, 3,//HS_FDIAGONAL1 6
    8, 3,//HS_BDIAGONAL1 7
    1, 0,//HS_SOLID 8
    8, 3,//HS_DENSE1 9
    8, 3,//HS_DENSE2 10
    8, 3,//HS_DENSE3 11
    8, 3,//HS_DENSE4 12
    8, 3,//HS_DENSE5 13
    8, 3,//HS_DENSE6 14
    8, 3,//HS_DENSE7 15
    8, 3,//HS_DENSE8 16
    1, 0,//HS_NOSHADE 17
    2, 1,//HS_HALFTONE 18
};

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.