高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】setlogicalpalette And Inverted Bitmap
setlogicalpalette and inverted bitmap
setlogicalpalette and inverted bitmap
i am trying to find some general explanation as to how the gdi\opengl devices render to bitmap, particularly with regard to color. i am successfully rendering my layouts, but the colors appear to be inverted. using cmd_bmpout.cpp as an example, i am calling:
code:
// set the device properties using canvas passed in
std(cout) << " " << "canvas bits per pixel: " << canvas.bpp << std(endl);
pdevice->properties()->putat("bitperpixel", odrxvariantvalue(oduint32(canvas.bpp)));
// user-definable setting -- background color
std(cout) << " " << "canvas background color: rgb (" << canvas.backgroundr << ", " << canvas.backgroundg << ", " << canvas.backgroundb << ")" << std(endl);
pdevice->setbackgroundcolor(odrgb(canvas.backgroundr, canvas.backgroundg, canvas.backgroundb));
pdevice->setlogicalpalette(odcmacadpalette(odrgb(0,0,0)), 256);
// render...
odgsdcrect gsrect (0, 1000, 0, 1000);
pdevice->onsize(gsrect);
pdevice->update();
...for explanation, i am requested a white background and an 8-bit rendering. essentially, things that are white are supposed to be black and vice versa. i thought the palette might have been reversed, so i dumped it and got unexpected results.
so, my question is, how is the palette determined using this method and more specifically, what do the parameters to setlogicalpalette do?
thanks,
--chris
acad uses 2 different palettes for light and dark backgrounds. for example color with index 7 is white on dark background and black on light background.
setlogicalpalette() parameters are pointer to odcolorref array and its size. (size is always 256 for rendering acad files)
odcmacadpalette() returns one of acad palettes depending on passed background color. you requested palette for black backgound (0,0,0)
sergey slezkin
thanks for the explanation. i just figured out what was going on with your help.
thanks again...
chris
last edited by clubeck; 8th june 2005 at 09:06 amfff">.
calls to setbackgroundcolor() and setlogicalpalette() are independent.
first one sets background, second - color table.
odcmacadpalette() returns pointer to one of palettes depending on rgb passed to it.
code:
pdevice->setbackgroundcolor(odrgb(canvas.backgroundr, canvas.backgroundg, canvas.backgroundb));
pdevice->setlogicalpalette(odcmacadpalette(odrgb(0,0,0)), 256);
changing arguments of odrgb in second line does not effect background which is set by the first line.
sergey slezkin
is there any method of knowing what the palette values should be based on what is in the file, or is this strictly a user preference?
thanks,
chris
in pre-2004 acad versions colors in dwg (or dxf) files are stored as palette index. no information about background color is stored in file. usually cad drawings are supposed to be printed on white paper. to enable drafting with black background alternative palette was introduced.
since acad 2004 color can be specified not only by palette index but by rgb too.
sergey slezkin
|