X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/01871bf642aa91f0150285fa71e18151721de8e0..c37b0f0907b07878551a00165b0ad323bd2ccdaf:/src/stc/PlatWX.cpp?ds=sidebyside diff --git a/src/stc/PlatWX.cpp b/src/stc/PlatWX.cpp index c92a71592d..b752c39689 100644 --- a/src/stc/PlatWX.cpp +++ b/src/stc/PlatWX.cpp @@ -60,83 +60,19 @@ PRectangle PRectangleFromwxRect(wxRect rc) { rc.GetRight()+1, rc.GetBottom()+1); } -wxColour wxColourFromCA(const ColourAllocated& ca) { - ColourDesired cd(ca.AsLong()); +wxColour wxColourFromCD(ColourDesired& cd) { return wxColour((unsigned char)cd.GetRed(), (unsigned char)cd.GetGreen(), (unsigned char)cd.GetBlue()); } -wxColour wxColourFromCAandAlpha(const ColourAllocated& ca, int alpha) { - ColourDesired cd(ca.AsLong()); +wxColour wxColourFromCDandAlpha(ColourDesired& cd, int alpha) { return wxColour((unsigned char)cd.GetRed(), (unsigned char)cd.GetGreen(), (unsigned char)cd.GetBlue(), (unsigned char)alpha); } -//---------------------------------------------------------------------- - -Palette::Palette() { - used = 0; - allowRealization = false; - size = 100; - entries = new ColourPair[size]; -} - -Palette::~Palette() { - Release(); - wxDELETEA(entries); -} - -void Palette::Release() { - used = 0; - delete [] entries; - size = 100; - entries = new ColourPair[size]; -} - -// This method either adds a colour to the list of wanted colours (want==true) -// or retrieves the allocated colour back to the ColourPair. -// This is one method to make it easier to keep the code for wanting and retrieving in sync. -void Palette::WantFind(ColourPair &cp, bool want) { - if (want) { - for (int i=0; i < used; i++) { - if (entries[i].desired == cp.desired) - return; - } - - if (used >= size) { - int sizeNew = size * 2; - ColourPair *entriesNew = new ColourPair[sizeNew]; - for (int j=0; j= 700) + weight = wxFONTWEIGHT_BOLD; + else + weight = wxFONTWEIGHT_NORMAL; + + wxFont* font = new wxFont(fp.size, + wxFONTFAMILY_DEFAULT, + fp.italic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL, + weight, + false, + stc2wx(fp.faceName), + encoding); fid = font; } @@ -200,42 +142,43 @@ public: virtual void Release(); virtual bool Initialised(); - virtual void PenColour(ColourAllocated fore); + virtual void PenColour(ColourDesired fore); virtual int LogPixelsY(); virtual int DeviceHeightFont(int points); virtual void MoveTo(int x_, int y_); virtual void LineTo(int x_, int y_); - virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back); - virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back); - virtual void FillRectangle(PRectangle rc, ColourAllocated back); + virtual void Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired back); + virtual void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back); + virtual void FillRectangle(PRectangle rc, ColourDesired back); virtual void FillRectangle(PRectangle rc, Surface &surfacePattern); - virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back); - virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, - ColourAllocated outline, int alphaOutline, int flags); - virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back); + virtual void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back); + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill, + ColourDesired outline, int alphaOutline, int flags); + virtual void DrawRGBAImage(PRectangle rc, int width, int height, + const unsigned char *pixelsImage); + virtual void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back); virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource); - virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); - virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); - virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore); - virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions); - virtual int WidthText(Font &font_, const char *s, int len); - virtual int WidthChar(Font &font_, char ch); - virtual int Ascent(Font &font_); - virtual int Descent(Font &font_); - virtual int InternalLeading(Font &font_); - virtual int ExternalLeading(Font &font_); - virtual int Height(Font &font_); - virtual int AverageCharWidth(Font &font_); - - virtual int SetPalette(Palette *pal, bool inBackGround); + virtual void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back); + virtual void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back); + virtual void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore); + virtual void MeasureWidths(Font &font_, const char *s, int len, XYPOSITION *positions); + virtual XYPOSITION WidthText(Font &font_, const char *s, int len); + virtual XYPOSITION WidthChar(Font &font_, char ch); + virtual XYPOSITION Ascent(Font &font_); + virtual XYPOSITION Descent(Font &font_); + virtual XYPOSITION InternalLeading(Font &font_); + virtual XYPOSITION ExternalLeading(Font &font_); + virtual XYPOSITION Height(Font &font_); + virtual XYPOSITION AverageCharWidth(Font &font_); + virtual void SetClip(PRectangle rc); virtual void FlushCachedState(); virtual void SetUnicodeMode(bool unicodeMode_); virtual void SetDBCSMode(int codePage); - void BrushColour(ColourAllocated back); + void BrushColour(ColourDesired back); void SetFont(Font &font_); }; @@ -268,13 +211,14 @@ void SurfaceImpl::Init(SurfaceID hdc_, WindowID) { hdc = (wxDC*)hdc_; } -void SurfaceImpl::InitPixMap(int width, int height, Surface *WXUNUSED(surface_), WindowID) { +void SurfaceImpl::InitPixMap(int width, int height, Surface *WXUNUSED(surface_), WindowID winid) { Release(); hdc = new wxMemoryDC(); hdcOwned = true; if (width < 1) width = 1; if (height < 1) height = 1; - bitmap = new wxBitmap(width, height); + bitmap = new wxBitmap(); + bitmap->CreateScaled(width, height,wxBITMAP_SCREEN_DEPTH,((wxWindow*)winid)->GetContentScaleFactor()); ((wxMemoryDC*)hdc)->SelectObject(*bitmap); } @@ -298,12 +242,12 @@ bool SurfaceImpl::Initialised() { } -void SurfaceImpl::PenColour(ColourAllocated fore) { - hdc->SetPen(wxPen(wxColourFromCA(fore))); +void SurfaceImpl::PenColour(ColourDesired fore) { + hdc->SetPen(wxPen(wxColourFromCD(fore))); } -void SurfaceImpl::BrushColour(ColourAllocated back) { - hdc->SetBrush(wxBrush(wxColourFromCA(back))); +void SurfaceImpl::BrushColour(ColourDesired back) { + hdc->SetBrush(wxBrush(wxColourFromCD(back))); } void SurfaceImpl::SetFont(Font &font_) { @@ -331,19 +275,26 @@ void SurfaceImpl::LineTo(int x_, int y_) { y = y_; } -void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back) { +void SurfaceImpl::Polygon(Point *pts, int npts, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); - hdc->DrawPolygon(npts, (wxPoint*)pts); + wxPoint *p = new wxPoint[npts]; + + for (int i=0; iDrawPolygon(npts, p); + delete [] p; } -void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) { +void SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); hdc->DrawRectangle(wxRectFromPRectangle(rc)); } -void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) { +void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) { BrushColour(back); hdc->SetPen(*wxTRANSPARENT_PEN); hdc->DrawRectangle(wxRectFromPRectangle(rc)); @@ -360,26 +311,26 @@ void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) { hdc->DrawRectangle(wxRectFromPRectangle(rc)); } -void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) { +void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); hdc->DrawRoundedRectangle(wxRectFromPRectangle(rc), 4); } -#ifdef __WXMSW__ +#if defined(__WXMSW__) || defined(__WXMAC__) #define wxPy_premultiply(p, a) ((p) * (a) / 0xff) #else #define wxPy_premultiply(p, a) (p) #endif void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, - ColourAllocated fill, int alphaFill, - ColourAllocated outline, int alphaOutline, + ColourDesired fill, int alphaFill, + ColourDesired outline, int alphaOutline, int /*flags*/) { #if wxUSE_GRAPHICS_CONTEXT wxGCDC dc(*(wxMemoryDC*)hdc); - wxColour penColour(wxColourFromCAandAlpha(outline, alphaOutline)); - wxColour brushColour(wxColourFromCAandAlpha(fill, alphaFill)); + wxColour penColour(wxColourFromCDandAlpha(outline, alphaOutline)); + wxColour brushColour(wxColourFromCDandAlpha(fill, alphaFill)); dc.SetPen(wxPen(penColour)); dc.SetBrush(wxBrush(brushColour)); dc.DrawRoundedRectangle(wxRectFromPRectangle(rc), cornerSize); @@ -394,55 +345,60 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, int x, y; wxRect r = wxRectFromPRectangle(rc); wxBitmap bmp(r.width, r.height, 32); - wxAlphaPixelData pixData(bmp); - // Set the fill pixels - ColourDesired cdf(fill.AsLong()); - int red = cdf.GetRed(); - int green = cdf.GetGreen(); - int blue = cdf.GetBlue(); + // This block is needed to ensure that the changes done to the bitmap via + // pixel data object are committed before the bitmap is drawn. + { + wxAlphaPixelData pixData(bmp); + + // Set the fill pixels + ColourDesired cdf(fill.AsLong()); + int red = cdf.GetRed(); + int green = cdf.GetGreen(); + int blue = cdf.GetBlue(); + + wxAlphaPixelData::Iterator p(pixData); + for (y=0; yDrawBitmap(bmp, r.x, r.y, true); +#endif +} + + +void SurfaceImpl::Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back) { PenColour(fore); BrushColour(back); hdc->DrawEllipse(wxRectFromPRectangle(rc)); @@ -470,12 +465,12 @@ void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource) { from.x, from.y, wxCOPY); } -void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, +void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, XYPOSITION ybase, const char *s, int len, - ColourAllocated fore, ColourAllocated back) { + ColourDesired fore, ColourDesired back) { SetFont(font); - hdc->SetTextForeground(wxColourFromCA(fore)); - hdc->SetTextBackground(wxColourFromCA(back)); + hdc->SetTextForeground(wxColourFromCD(fore)); + hdc->SetTextBackground(wxColourFromCD(back)); FillRectangle(rc, back); // ybase is where the baseline should be, but wxWin uses the upper left @@ -483,12 +478,12 @@ void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, hdc->DrawText(stc2wx(s, len), rc.left, ybase - font.ascent); } -void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, +void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, XYPOSITION ybase, const char *s, int len, - ColourAllocated fore, ColourAllocated back) { + ColourDesired fore, ColourDesired back) { SetFont(font); - hdc->SetTextForeground(wxColourFromCA(fore)); - hdc->SetTextBackground(wxColourFromCA(back)); + hdc->SetTextForeground(wxColourFromCD(fore)); + hdc->SetTextBackground(wxColourFromCD(back)); FillRectangle(rc, back); hdc->SetClippingRegion(wxRectFromPRectangle(rc)); @@ -498,12 +493,12 @@ void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, } -void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, int ybase, +void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, XYPOSITION ybase, const char *s, int len, - ColourAllocated fore) { + ColourDesired fore) { SetFont(font); - hdc->SetTextForeground(wxColourFromCA(fore)); + hdc->SetTextForeground(wxColourFromCD(fore)); hdc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); // ybase is where the baseline should be, but wxWin uses the upper left @@ -514,7 +509,7 @@ void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, int ybase, } -void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) { +void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, XYPOSITION *positions) { wxString str = stc2wx(s, len); wxArrayInt tpos; @@ -554,7 +549,7 @@ void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positio } -int SurfaceImpl::WidthText(Font &font, const char *s, int len) { +XYPOSITION SurfaceImpl::WidthText(Font &font, const char *s, int len) { SetFont(font); int w; int h; @@ -564,7 +559,7 @@ int SurfaceImpl::WidthText(Font &font, const char *s, int len) { } -int SurfaceImpl::WidthChar(Font &font, char ch) { +XYPOSITION SurfaceImpl::WidthChar(Font &font, char ch) { SetFont(font); int w; int h; @@ -576,7 +571,7 @@ int SurfaceImpl::WidthChar(Font &font, char ch) { #define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") -int SurfaceImpl::Ascent(Font &font) { +XYPOSITION SurfaceImpl::Ascent(Font &font) { SetFont(font); int w, h, d, e; hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); @@ -584,38 +579,34 @@ int SurfaceImpl::Ascent(Font &font) { return font.ascent; } -int SurfaceImpl::Descent(Font &font) { +XYPOSITION SurfaceImpl::Descent(Font &font) { SetFont(font); int w, h, d, e; hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); return d; } -int SurfaceImpl::InternalLeading(Font &WXUNUSED(font)) { +XYPOSITION SurfaceImpl::InternalLeading(Font &WXUNUSED(font)) { return 0; } -int SurfaceImpl::ExternalLeading(Font &font) { +XYPOSITION SurfaceImpl::ExternalLeading(Font &font) { SetFont(font); int w, h, d, e; hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); return e; } -int SurfaceImpl::Height(Font &font) { +XYPOSITION SurfaceImpl::Height(Font &font) { SetFont(font); return hdc->GetCharHeight() + 1; } -int SurfaceImpl::AverageCharWidth(Font &font) { +XYPOSITION SurfaceImpl::AverageCharWidth(Font &font) { SetFont(font); return hdc->GetCharWidth(); } -int SurfaceImpl::SetPalette(Palette *WXUNUSED(pal), bool WXUNUSED(inBackGround)) { - return 0; -} - void SurfaceImpl::SetClip(PRectangle rc) { hdc->SetClippingRegion(wxRectFromPRectangle(rc)); } @@ -632,7 +623,7 @@ void SurfaceImpl::SetDBCSMode(int WXUNUSED(codePage)) { } -Surface *Surface::Allocate() { +Surface *Surface::Allocate(int WXUNUSED(technology)) { return new SurfaceImpl; } @@ -849,6 +840,10 @@ public: lv->Reparent(this); #ifdef __WXMSW__ lv->Show(); +#endif +#if defined(__WXOSX_COCOA__) || defined(__WXGTK__) + // This color will end up being our border + SetBackgroundColour(wxColour(0xC0, 0xC0, 0xC0)); #endif } @@ -908,10 +903,20 @@ public: void OnSize(wxSizeEvent& event) { // resize the child to fill the popup wxSize sz = GetClientSize(); - lv->SetSize(0, 0, sz.x, sz.y); + int x, y, w, h; + x = y = 0; + w = sz.x; + h = sz.y; +#if defined(__WXOSX_COCOA__) || defined(__WXGTK__) + // make room for the parent's bg color to show, to act as a border + x = y = 1; + w -= 2; + h -= 2; +#endif + lv->SetSize(x, y, w, h); // reset the column widths lv->SetColumnWidth(0, IconWidth()+4); - lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) - + lv->SetColumnWidth(1, w - 2 - lv->GetColumnWidth(0) - wxSystemSettings::GetMetric(wxSYS_VSCROLL_X)); event.Skip(); } @@ -1112,9 +1117,10 @@ private: public: ListBoxImpl(); ~ListBoxImpl(); + static ListBox *Allocate(); virtual void SetFont(Font &font); - virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_); + virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_, int technology_); virtual void SetAverageCharWidth(int width); virtual void SetVisibleRows(int rows); virtual int GetVisibleRows() const; @@ -1129,6 +1135,8 @@ public: virtual int Find(const char *prefix); virtual void GetValue(int n, char *value, int len); virtual void RegisterImage(int type, const char *xpm_data); + void RegisterImageHelper(int type, wxBitmap& bmp); + virtual void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage); virtual void ClearRegisteredImages(); virtual void SetDoubleClickAction(CallBackAction, void *); virtual void SetList(const char* list, char separator, char typesep); @@ -1153,7 +1161,7 @@ void ListBoxImpl::SetFont(Font &font) { } -void ListBoxImpl::Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_) { +void ListBoxImpl::Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_, int WXUNUSED(technology_)) { location = location_; lineHeight = lineHeight_; unicodeMode = unicodeMode_; @@ -1298,12 +1306,8 @@ void ListBoxImpl::GetValue(int n, char *value, int len) { value[len-1] = '\0'; } - -void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { - wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1); - wxImage img(stream, wxBITMAP_TYPE_XPM); - wxBitmap bmp(img); - +void ListBoxImpl::RegisterImageHelper(int type, wxBitmap& bmp) +{ if (! imgList) { // assumes all images are the same size imgList = new wxImageList(bmp.GetWidth(), bmp.GetHeight(), true); @@ -1321,6 +1325,24 @@ void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { itm[type] = idx; } +void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { + wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1); + wxImage img(stream, wxBITMAP_TYPE_XPM); + wxBitmap bmp(img); + RegisterImageHelper(type, bmp); +} + + +void ListBoxImpl::RegisterRGBAImage(int type, int width, int height, + const unsigned char *pixelsImage) +{ +#ifdef wxHAS_RAW_BITMAP + wxBitmap bmp = BitmapFromRGBAImage(width, height, pixelsImage); + RegisterImageHelper(type, bmp); +#endif +} + + void ListBoxImpl::ClearRegisteredImages() { wxDELETE(imgList); wxDELETE(imgTypeMap); @@ -1388,7 +1410,7 @@ ColourDesired Platform::ChromeHighlight() { const char *Platform::DefaultFont() { static char buf[128]; - strcpy(buf, wxNORMAL_FONT->GetFaceName().mbc_str()); + wxStrlcpy(buf, wxNORMAL_FONT->GetFaceName().mbc_str(), WXSIZEOF(buf)); return buf; } @@ -1570,7 +1592,7 @@ wxString stc2wx(const char* str) } -const wxWX2MBbuf wx2stc(const wxString& str) +wxWX2MBbuf wx2stc(const wxString& str) { const wchar_t* wcstr = str.c_str(); size_t wclen = str.length();