12 #pragma push_macro("new")
14 #define __TnbNEEDPOPNEW__
23#pragma comment(lib, "gdiplus.lib")
35 _SELECTANY ULONG_PTR s_uGdiToken = 0;
70 class CPos :
public Gdiplus::PointF
72 DEFSUPER(Gdiplus::PointF);
74 template<
typename T> Gdiplus::REAL _(T t)
const
76 return static_cast<Gdiplus::REAL
>(t);
84 CPos(
double x,
double y) : _super(_(x), _(y)) { }
89 CPos(
const POINT& pos) : _super(_(pos.x), _(pos.y)) { }
94 CPos(
const SIZE& sz) : _super(_(sz.cx), _(sz.cy)) { }
121 m_pGraphics = Gdiplus::Graphics::FromHDC(hdc);
122 m_pGraphics->SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
141 if (
this != &other )
146 m_pGraphics = Gdiplus::Graphics::FromHDC(m_hDC);
147 m_pGraphics->SetTextRenderingHint(other.m_pGraphics->GetTextRenderingHint());
149 m_pFont = other.m_pFont;
150 m_pBrush = other.m_pBrush;
151 m_pPen = other.m_pPen;
152 m_pStringFormat = other.m_pStringFormat;
168 m_pGraphics = Gdiplus::Graphics::FromHDC(hdc);
169 m_pGraphics->SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
170 return m_Ret(m_pGraphics);
182 m_pFont =
new Gdiplus::Font(m_hDC, hFont);
183 return m_Ret(m_pFont);
210 Gdiplus::FontFamily fontfamily(lpszFontName);
211 m_pFont =
new Gdiplus::Font(&fontfamily, size, style, Gdiplus::UnitPixel);
212 return m_Ret(m_pFont);
226 c.SetFromCOLORREF(color);
227 m_pBrush =
new Gdiplus::SolidBrush(c);
228 return m_Ret(m_pBrush);
242 Gdiplus::Bitmap bm(bmp, h);
243 if ( bm.GetLastStatus() == Gdiplus::Ok )
245 m_pBrush =
new Gdiplus::TextureBrush(&bm);
246 return m_Ret(m_pBrush);
268 co.SetFromCOLORREF(color);
269 m_pPen =
new Gdiplus::Pen(co, width);
270 return m_Ret(m_pPen);
282 CLEARTYPE = Gdiplus::TextRenderingHintClearTypeGridFit
295 if ( m_pGraphics.
IsNull() ) {
return false; }
301 Gdiplus::TextRenderingHint h =
static_cast<Gdiplus::TextRenderingHint
>(i);
302 return m_Ret(m_pGraphics->SetTextRenderingHint(h));
314 m_pStringFormat = ms_DtToStringFormat(drawTextStyle);
315 return m_Ret(m_pStringFormat);
329 if ( m_pGraphics.
IsNull() || m_pFont.
IsNull() || m_pBrush.
IsNull() ) {
return false; }
330 Gdiplus::RectF rcf(_(rc.left), _(rc.top), _(rc.right - rc.left + 1), _(rc.bottom - rc.top + 1));
331 Gdiplus::Status r = m_pGraphics->DrawString(lpsz, -1, m_pFont, rcf, m_pStringFormat, m_pBrush);
346 if ( m_pGraphics.
IsNull() || m_pFont.
IsNull() || m_pBrush.
IsNull() ) {
return false; }
347 Gdiplus::Status r = m_pGraphics->DrawString(lpsz, -1, m_pFont, po, m_pStringFormat, m_pBrush);
360 HIGH = Gdiplus::InterpolationModeHighQuality,
364 LOW = Gdiplus::InterpolationModeLowQuality,
377 if ( m_pGraphics.
IsNull() ) {
return false; }
378 Gdiplus::Status r = m_pGraphics->SetInterpolationMode(
static_cast<Gdiplus::InterpolationMode
>(mode));
401 if ( m_pImageAttr.
IsNull() )
403 m_pImageAttr =
new Gdiplus::ImageAttributes();
407 c1.SetFromCOLORREF(colorLow);
408 c2.SetFromCOLORREF(colorHigh);
409 m_pImageAttr->SetColorKey(c1, c2);
420 if ( m_pImageAttr.
IsNull() )
422 m_pImageAttr =
new Gdiplus::ImageAttributes();
439 if ( m_pGraphics.
IsNull() ) {
return false; }
441 Gdiplus::Bitmap bm(bmp, h);
442 Gdiplus::PointF pos[3];
445 pos[1].X = _(po.X + bm.GetWidth() * mag);
448 pos[2].Y = _(po.Y + bm.GetHeight() * mag);
451 pos[0].X = _(po.X + bm.GetWidth() * mag);
457 pos[0].Y = _(po.Y + bm.GetHeight() * mag);
461 return m_DrawImage(bm, pos, 3);
474 bool DrawFitImage(
const RECT& rc, HBITMAP bmp,
bool isFlipX =
false,
bool isFlipY =
false)
const
476 if ( m_pGraphics.
IsNull() ) {
return false; }
478 Gdiplus::Bitmap bm(bmp, h);
479 double width = rc.right - rc.left;
480 double height = rc.bottom - rc.top;
481 double dx = width / bm.GetWidth();
482 double dy = height / bm.GetHeight();
489 double x = (width - bm.GetWidth() * d);
490 po.X =
static_cast<float>(x / 2.0);
496 double y = (height - bm.GetHeight() * d);
497 po.Y =
static_cast<float>(y / 2.0);
499 return DrawImage(po, bmp, d, isFlipX, isFlipY);
514 if ( m_pGraphics.
IsNull() ) {
return false; }
515 HPALETTE hPalette = NULL;
516 Gdiplus::Bitmap bm(bmp, hPalette);
517 Gdiplus::PointF pos[3];
518 double restW = bm.GetWidth() - hotSpot.X;
519 double restH = bm.GetHeight() - hotSpot.Y;
520 double radian = ToRadian(angle);
521 double sinVal =
::sin(radian);
522 double cosVal =
::cos(radian);
524 pos[0].X = _(((hotSpot.X * -cosVal) - (hotSpot.Y * -sinVal)) * mag + po.X);
525 pos[0].Y = _(((hotSpot.X * -sinVal) + (hotSpot.Y * -cosVal)) * mag + po.Y);
526 pos[1].X = _(((restW * cosVal) - (hotSpot.Y * -sinVal)) * mag + po.X);
527 pos[1].Y = _(((restW * sinVal) + (hotSpot.Y * -cosVal)) * mag + po.Y);
528 pos[2].X = _(((hotSpot.X * -cosVal) - (restH * sinVal)) * mag + po.X);
529 pos[2].Y = _(((hotSpot.X * -sinVal) + (restH * cosVal)) * mag + po.Y);
531 return m_DrawImage(bm, pos, 3);
547 if ( ::GetObject(bmp,
sizeof(BITMAP), &bm) )
565 if ( m_pGraphics.
IsNull() ) {
return false; }
567 Gdiplus::Bitmap bm(bmp, h);
568 Gdiplus::PointF pos[3];
571 pos[1].X = _(po.X + bm.GetWidth() * mag);
572 pos[1].Y = _(po.Y + diff.Y * mag);
573 pos[2].X = _(po.X + diff.X * mag);
574 pos[2].Y = _(po.Y + bm.GetHeight() * mag);
576 return m_DrawImage(bm, pos, 3);
589 NONE = Gdiplus::SmoothingModeNone,
602 if ( m_pGraphics.
IsNull() ) {
return false; }
603 Gdiplus::Status r = m_pGraphics->SetSmoothingMode(
static_cast<Gdiplus::SmoothingMode
>(mode));
617 if ( m_pGraphics.
IsNull() ) {
return false; }
618 Gdiplus::Status r = m_pGraphics->DrawLine(m_pPen, s, e);
650 if ( s_uGdiToken == 0 )
653 Gdiplus::GdiplusStartupInput startupInput;
654 Gdiplus::GdiplusStartup(&s_uGdiToken, &startupInput, NULL);
656 return s_uGdiToken != 0;
690 Gdiplus::Bitmap bm(lpsz);
691 if ( bm.GetLastStatus() == Gdiplus::Ok )
694 c.SetFromCOLORREF(RGB(255, 255, 255));
696 if ( bm.GetHBITMAP(c, &hBmp) == Gdiplus::Ok )
714 Gdiplus::Bitmap bmp(lpsz);
715 if ( bmp.GetLastStatus() == Gdiplus::Ok )
717 UINT size = bmp.GetPropertyItemSize(PropertyTagThumbnailData);
720 HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, size);
721 BYTE* B =
static_cast<BYTE *
>(::GlobalLock(hGlobal));
722 Gdiplus::PropertyItem* P =
reinterpret_cast<Gdiplus::PropertyItem*
>(B);
723 bmp.GetPropertyItem(PropertyTagThumbnailData, size, P);
725 ::GlobalUnlock(hGlobal);
727 CreateStreamOnHGlobal(hGlobal, TRUE, &pis);
728 Gdiplus::Bitmap bm(pis);
729 if ( bm.GetLastStatus() == Gdiplus::Ok )
732 c.SetFromCOLORREF(RGB(0, 0, 0));
734 if ( bm.GetHBITMAP(c, &hBmp) == Gdiplus::Ok )
737 ::GlobalFree(hGlobal);
745 ::GlobalFree(hGlobal);
780 Gdiplus::EncoderParameters encoderParameters;
781 Gdiplus::EncoderParameters* pEncoderParameters = NULL;
785 default: lpFmtDes = L
"BMP";
break;
786 case GIF: lpFmtDes = L
"GIF";
break;
787 case TIFF: lpFmtDes = L
"TIFF";
break;
788 case PNG: lpFmtDes = L
"PNG";
break;
791 encoderParameters.Count = 1;
792 encoderParameters.Parameter[0].Guid = Gdiplus::EncoderQuality;
793 encoderParameters.Parameter[0].Type = Gdiplus::EncoderParameterValueTypeLong;
794 encoderParameters.Parameter[0].NumberOfValues = 1;
795 encoderParameters.Parameter[0].Value = &jpegQuality;
796 pEncoderParameters = &encoderParameters;
801 Gdiplus::GetImageEncodersSize(&numEncoders, &size);
803 Gdiplus::ImageCodecInfo* pEncoders =
reinterpret_cast<Gdiplus::ImageCodecInfo*
>(work.
Ref());
804 Gdiplus::GetImageEncoders(numEncoders, size, pEncoders);
805 loop ( i, numEncoders )
809 return bmp.Save(lpsz, &(pEncoders[i].Clsid), pEncoderParameters) == Gdiplus::Ok;
828 Gdiplus::Bitmap bm(hBmp, h);
829 return SaveBitmap(lpsz, bm, fmt, jpegQuality);
840 if ( s_uGdiToken != 0 )
842 Gdiplus::GdiplusShutdown(s_uGdiToken);
860 static Gdiplus::StringFormat* ms_DtToStringFormat(DWORD drawTextStyle)
862 Gdiplus::StringFormat* P =
new Gdiplus::StringFormat();
863 Gdiplus::StringAlignment alignX = Gdiplus::StringAlignmentNear;
864 if ( (drawTextStyle & DT_CENTER) != 0 )
866 alignX = Gdiplus::StringAlignmentCenter;
868 else if ( (drawTextStyle & DT_RIGHT) != 0 )
870 alignX = Gdiplus::StringAlignmentFar;
872 P->SetAlignment(alignX);
873 Gdiplus::StringAlignment alignY = Gdiplus::StringAlignmentNear;
874 if ( (drawTextStyle & DT_VCENTER) != 0 )
876 alignY = Gdiplus::StringAlignmentCenter;
878 else if ( (drawTextStyle & DT_BOTTOM) != 0 )
880 alignY = Gdiplus::StringAlignmentFar;
882 P->SetLineAlignment(alignY);
885 if ( (drawTextStyle & DT_SINGLELINE) == 0 )
887 formatFlags |= Gdiplus::StringFormatFlagsNoClip;
889 P->SetFormatFlags(formatFlags);
891 Gdiplus::StringTrimming trim = Gdiplus::StringTrimmingNone;
892 if ( (drawTextStyle & DT_END_ELLIPSIS) != 0 )
894 trim = Gdiplus::StringTrimmingEllipsisCharacter;
896 if ( (drawTextStyle & DT_WORD_ELLIPSIS) != 0 )
898 trim = Gdiplus::StringTrimmingEllipsisWord;
900 if ( (drawTextStyle & DT_PATH_ELLIPSIS) != 0 )
902 trim = Gdiplus::StringTrimmingEllipsisPath;
904 P->SetTrimming(trim);
906 if ( (drawTextStyle & DT_NOPREFIX) != 0 )
908 P->SetHotkeyPrefix(Gdiplus::HotkeyPrefixNone);
912 P->SetHotkeyPrefix(Gdiplus::HotkeyPrefixShow);
917 template<
typename T> Gdiplus::REAL _(T t)
const
919 return static_cast<Gdiplus::REAL
>(t);
922 static double PI(
void)
924 return 3.141592653589793;
927 static double ToRadian(
double angle)
929 return angle * PI() / 180.0;
932 static double ToAngle(
double radian)
934 return radian * 180.0 / PI();
937 bool m_Ret(Gdiplus::Status s)
const
939 return s == Gdiplus::Ok;
942 template<
typename TYP>
945 return P->GetLastStatus() == Gdiplus::Ok;
950 bool m_DrawImage(Gdiplus::Bitmap& bm, Gdiplus::PointF* pPos,
int posLength)
const
952 ASSERT( ! ::IsBadReadPtr(pPos,
sizeof(Gdiplus::PointF) * posLength) );
953 if ( ! m_pImageAttr.
IsNull() )
955 Gdiplus::Status r = m_pGraphics->DrawImage( &bm, pPos, posLength, 0, 0, _(bm.GetWidth()), _(bm.GetHeight()), Gdiplus::UnitPixel, m_pImageAttr);
958 return m_Ret(m_pGraphics->DrawImage(&bm, pPos, posLength));
968#ifdef __TnbNEEDPOPNEW__
969 #pragma pop_macro("new")
#define loop(VAR, CNT)
loop構文.
CPos(double x, double y)
コンストラクタ.
CPos(const SIZE &sz)
コンストラクタ.
CPos(const POINT &pos)
コンストラクタ.
bool DrawRotateImage(const CGdiPlus::CPos &po, HBITMAP bmp, double angle, double mag=1.0) const
[描画] ビットマップ回転描画.
bool SetPen(COLORREF color, float width)
[設定] ペン設定.
CGdiPlus(const CGdiPlus &other)
コピーコンストラクタ.
bool DrawFitImage(const RECT &rc, HBITMAP bmp, bool isFlipX=false, bool isFlipY=false) const
[描画] ビットマップフィット描画.
bool SetTextRenderingHint(ETextRenderingHint hint, bool boIsGridFit=false)
[設定] テキストレンダリングヒント設定.
void SetImageTransparentColor(COLORREF colorLow, COLORREF colorHigh)
[設定] イメージ描画透過色指定.
void ClearImageAttribute(void)
[設定] イメージ描画属性クリア.
bool SetBrush(COLORREF color)
[設定] ブラシ設定.
virtual ~CGdiPlus(void)
デストラクタ
static HBITMAP LoadBitmap(LPCWSTR lpsz)
[作成] 画像ファイル読込み.
bool SetFont(HFONT hFont)
[設定] フォント設定.
bool SetImageInterpolationMode(EInterpolationMode mode)
[設定] イメージ描画アルゴリズム設定.
bool DrawImage(const CGdiPlus::CPos &po, HBITMAP bmp, double mag=1.0, bool isFlipX=false, bool isFlipY=false) const
[描画] ビットマップ描画.
static bool DrawAntialiasText(HDC dc, HFONT hFont, DWORD drawTextStyle, COLORREF color, const CGdiPlus::CPos &po, LPCWSTR lpsz)
[表示] 文字列表示.
EInterpolationMode
イメージ操作アルゴリズムモード値.
@ NEAREST_NEIGHBOR
最近傍補間を指定します。
@ BILINEAR
双一次補間を指定します。事前フィルタ処理は実行されません。このモードは、イメージを元のサイズの 50% 以下にするような縮小処理には適していません。
@ HQ_BICUBIC
高品質双三次補間を指定します。事前フィルタ処理が適用され、高品質の縮小処理が実行されます。このモードを使用すると、変換後のイメージが高品質になります。
@ BICUBIC
双三次補間を指定します。事前フィルタ処理は実行されません。このモードは、イメージを元のサイズの 25% 以下にするような縮小処理には適していません。
@ HQ_BILINEAR
高品質双一次補間を指定します。事前フィルタ処理が適用され、高品質の縮小処理が実行されます。
bool SetTextStyle(DWORD drawTextStyle)
[設定] テキストスタイル設定.
static bool SaveBitmap(LPCWSTR lpsz, HBITMAP hBmp, EBitmapFormat fmt=BMP, LONG jpegQuality=80)
[作成] 画像ファイル作成.
bool SetFont(LPCWSTR lpszFontName, float size, int style=REGULAR)
[設定] フォント設定.
bool DrawText(const CGdiPlus::CPos &po, LPCWSTR lpsz) const
[描画] テキスト描画.
static HBITMAP LoadThumbnail(LPCWSTR lpsz)
[作成] サムネイル画像ファイル読込み.
bool DrawRotateImage(const CGdiPlus::CPos &po, HBITMAP bmp, const CGdiPlus::CPos &hotSpot, double angle, double mag=1.0) const
[描画] ビットマップ回転描画.
CGdiPlus & operator=(const CGdiPlus &other)
コピーオペレータ.
bool SetBrush(HBITMAP bmp)
[設定] ブラシ設定.
static bool Startup(void)
[設定] GDI+ 初期化.
bool DrawLine(const CPos &s, const CPos &e)
[描画] ライン描画.
ESmoothingMode
スムージングモード値.
@ ANTI_ALIAS
アンチエイリアス処理されたレタリングを指定します。
@ HIGH_SPEED
高速で、低品質のレンダリングを指定します。
@ NONE
アンチエイリアス処理しないことを指定します。
@ HIGH_QUALITY
高品質で低速なレンダリングを指定します。
bool SetSmoothingMode(ESmoothingMode mode)
[設定] スムージングモード設定.
bool DrawText(const RECT &rc, LPCWSTR lpsz) const
[描画] テキスト描画.
bool SetDC(HDC hdc)
[設定] デバイスコンテキスト設定.
bool DrawSkewImage(const CGdiPlus::CPos &po, HBITMAP bmp, const CGdiPlus::CPos &diff, double mag=1.0) const
[描画] ビットマップ傾斜描画.
ETextRenderingHint
テキストレンダリングヒント値.
@ SYSTEM_DEFAULT
システムデフォルト
static bool SaveBitmap(LPCWSTR lpsz, Gdiplus::Bitmap &bmp, EBitmapFormat fmt=BMP, LONG jpegQuality=80)
[作成] 画像ファイル作成.
CPointerHandleT< Gdiplus::ImageAttributes > ReferImageAttribute(void)
[設定] イメージ描画属性参照.
CGdiPlus(HDC hdc)
コンストラクタ.
bool IsNull(void) const
[確認] NULLチェック
const TYP * Ref(void) const
[取得] ポインタ取得
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
CRealNumber sin(const CValueDegree &d)
[計算] sin (値 = sin(角度))
CRealNumber cos(const CValueDegree &d)
[計算] cos (値 = cos(角度))
void MemCopy(T *_pDst, const void *pSrc, size_t len)
[複製] メモリコピー