CtrlCore: Fixed Win32 printing, plugin/jpg: orientation endiannes

git-svn-id: svn://ultimatepp.org/upp/trunk@6580 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2013-11-19 15:14:04 +00:00
parent 208a003677
commit 9ca570718e
4 changed files with 33 additions and 48 deletions

View file

@ -254,13 +254,18 @@ void ImageSysData::Paint(SystemDraw& w, int x, int y, const Rect& src, Color c)
if(sr.IsEmpty())
return;
int kind = img.GetKind();
// DDUMP(GetDeviceCaps(dc, RASTERCAPS) & RC_BITBLT);
// DDUMP(GetDeviceCaps(dc, RASTERCAPS) & RC_DI_BITMAP);
if(kind == IMAGE_EMPTY)
return;
if(kind == IMAGE_OPAQUE && !IsNull(c)) {
w.DrawRect(x, y, sz.cx, sz.cy, c);
return;
}
if(kind == IMAGE_OPAQUE && paintcount == 0 && sr == Rect(sz) && IsWinNT() && w.IsGui()) {
if(kind == IMAGE_OPAQUE && (paintcount == 0 || w.IsPrinter()) && sr == Rect(sz) &&
(GetDeviceCaps(dc, RASTERCAPS) & RC_DIBTODEV)) {
LTIMING("Image Opaque direct set");
SetSurface(w, x, y, sz.cx, sz.cy, ~img);
paintcount++;
@ -279,41 +284,9 @@ void ImageSysData::Paint(SystemDraw& w, int x, int y, const Rect& src, Color c)
SysImageRealized(img);
return;
}
#if 0
if(kind == IMAGE_MASK/* || GetKind() == IMAGE_OPAQUE*/) {
HDC dcMem = ::CreateCompatibleDC(dc);
if(!hmask) {
LTIMING("Image Mask create");
Buffer<RGBA> bmp(len);
hmask = CreateBitMask(~img, sz, sz, sz, bmp);
if(!hbmp)
CreateHBMP(dc, bmp);
}
LTIMING("Image Mask blt");
HBITMAP o = (HBITMAP)::SelectObject(dcMem, ::CreateCompatibleBitmap(dc, sz.cx, sz.cy));
::BitBlt(dcMem, 0, 0, ssz.cx, ssz.cy, dc, x, y, SRCCOPY);
HDC dcMem2 = ::CreateCompatibleDC(dc);
::SelectObject(dcMem2, hmask);
::BitBlt(dcMem, 0, 0, ssz.cx, ssz.cy, dcMem2, sr.left, sr.top, SRCAND);
if(IsNull(c)) {
::SelectObject(dcMem2, hbmp);
::BitBlt(dcMem, 0, 0, ssz.cx, ssz.cy, dcMem2, sr.left, sr.top, SRCPAINT);
}
else {
HBRUSH ho = (HBRUSH) SelectObject(dcMem, CreateSolidBrush(c));
::BitBlt(dcMem, 0, 0, ssz.cx, ssz.cy, dcMem2, sr.left, sr.top, 0xba0b09);
::DeleteObject(::SelectObject(dcMem, ho));
}
::BitBlt(dc, x, y, ssz.cx, ssz.cy, dcMem, 0, 0, SRCCOPY);
::DeleteObject(::SelectObject(dcMem, o));
::DeleteDC(dcMem2);
::DeleteDC(dcMem);
SysImageRealized(img);
return;
}
#endif
#ifndef PLATFORM_WINCE
if(fnAlphaBlend() && IsNull(c) && !ImageFallBack) {
if(fnAlphaBlend() && IsNull(c) && !ImageFallBack &&
!(w.IsPrinter() && (GetDeviceCaps(dc, SHADEBLENDCAPS) & (SB_PIXEL_ALPHA|SB_PREMULT_ALPHA)) !=
(SB_PIXEL_ALPHA|SB_PREMULT_ALPHA))) {
if(!himg) {
LTIMING("Image Alpha create");
BitmapInfo32__ bi(sz.cx, sz.cy);
@ -334,12 +307,12 @@ void ImageSysData::Paint(SystemDraw& w, int x, int y, const Rect& src, Color c)
// ::DeleteDC(dcMem);
SysImageRealized(img);
}
else
#endif
{
else {
LTIMING("Image Alpha sw");
DrawSurface sf(w, x, y, ssz.cx, ssz.cy);
RGBA *t = sf;
if(w.IsPrinter()) // We have got here because printer does not support alpha blending
Fill(t, White(), ssz.cx * ssz.cy);
for(int i = sr.top; i < sr.bottom; i++) {
if(IsNull(c))
AlphaBlendOpaque(t, img[i] + sr.left, ssz.cx);

View file

@ -2,6 +2,8 @@
NAMESPACE_UPP
#define LLOG(x) DLOG(x)
Report::Report()
{
mg.x = mg.y = Null;
@ -64,6 +66,7 @@ void Report::StartPage(int i)
{
DrawingDraw dw(GetSize());
page.At(i) = dw;
LLOG("Creating page " << i);
Create(GetSize());
WhenPage();
PaintHF(*this, 0, header, i);
@ -128,6 +131,13 @@ Report& Report::Footer(const char *qtf, int spc)
return *this;
}
Report& Report::OnPage(Callback whenpage)
{
WhenPage = whenpage;
RestartPage();
return *this;
}
void Report::RestartPage()
{
page.SetCount(pagei + 1);

View file

@ -14,13 +14,13 @@ public:
virtual Draw& Page(int i);
private:
Array<Drawing> page;
int pagei;
int y;
String header, footer;
int headercy, headerspc, footercy, footerspc;
Point mg;
One<PrinterJob> printerjob;
Array<Drawing> page;
int pagei;
int y;
String header, footer;
int headercy, headerspc, footercy, footerspc;
Point mg;
One<PrinterJob> printerjob;
void Flush();
String FormatHF(const char *s, int pageno);
@ -28,9 +28,10 @@ private:
void PaintHF(Draw& w, int y, const char *qtf, int i);
void StartPage(int i);
void RestartPage();
Callback WhenPage;
public:
Callback WhenPage;
int GetCount() { Flush(); return page.GetCount(); }
Drawing GetPage(int i) { Flush(); return page[i]; }
@ -65,6 +66,7 @@ public:
Report& Margins(int top, int left) { mg.y = top; mg.x = left; return *this; }
Report& Header(const char *qtf, int spc = 150);
Report& Footer(const char *qtf, int spc = 150);
Report& OnPage(Callback whenpage);
Report& NoHeader() { return Header(NULL, 0); }
Report& NoFooter() { return Footer(NULL, 0); }

View file

@ -341,7 +341,7 @@ int JPGRaster::Data::ExifDir(const char *begin, int offset, IFD_TYPE type)
// i, tag, fmt, count, BinHexEncode(data, data + len)));
if(type == BASE_IFD) {
if(tag == 0x112)
metadata.Add("orientation", int(data[0]));
metadata.Add("orientation", Exif16(data[0]));
if(tag == 0x8825) {
int offset = Exif32(data);
// puts(NFormat("GPS IFD at %08x", offset));