diff --git a/layout/base/nsISelectionImageService.idl b/layout/base/nsISelectionImageService.idl new file mode 100644 index 00000000000..ca471cacffa --- /dev/null +++ b/layout/base/nsISelectionImageService.idl @@ -0,0 +1,43 @@ +/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + */ + +#include "nsISupports.idl" + +%{ C++ +class imgIContainer; +%} + +[ptr] native imgIContainer(imgIContainer); + + +[uuid(f6f68e3c-f078-4235-bf71-53d180c37d26)] +interface nsISelectionImageService : nsISupports +{ + /** + * the current image is marked as invalid + */ + void reset(); + + /** + * retrieve the image for alpha blending + */ + void getImage(in short selectionValue, out imgIContainer container); + +}; diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index bed41bb65c1..56b03d8f6ad 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -33,8 +33,7 @@ * the provisions above, a recipient may use your version of this file under * the terms of any one of the NPL, the GPL or the LGPL. * - * ***** END LICENSE BLOCK ***** */ -#include "nsCOMPtr.h" + * ***** END LICENSE BLOCK ***** */#include "nsCOMPtr.h" #include "nsPresContext.h" #include "nsIPresShell.h" #include "nsIPref.h" @@ -77,6 +76,9 @@ #include "nsIDOMHTMLImageElement.h" #include "nsIImageFrame.h" +//needed for resetting of image service color +#include "nsLayoutCID.h" +#include "nsISelectionImageService.h" static nscolor MakeColorPref(const char *colstr) @@ -130,6 +132,8 @@ PR_STATIC_CALLBACK(PRBool) destroy_loads(nsHashKey *aKey, void *aData, void* clo static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID); #include "nsContentCID.h" static NS_DEFINE_CID(kEventStateManagerCID, NS_EVENTSTATEMANAGER_CID); +static NS_DEFINE_CID(kSelectionImageService, NS_SELECTIONIMAGESERVICE_CID); + nsPresContext::nsPresContext() : mDefaultVariableFont("serif", NS_FONT_STYLE_NORMAL, NS_FONT_VARIANT_NORMAL, @@ -1734,6 +1738,13 @@ nsPresContext::SysColorChanged() mShell->GetStyleSet(getter_AddRefs(set)); set->ClearStyleData(this, nsnull, nsnull); } + nsCOMPtr imageService; + nsresult result; + imageService = do_GetService(kSelectionImageService, &result); + if (NS_SUCCEEDED(result) && imageService) + { + imageService->Reset(); + } return NS_OK; } diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 5a78494b7e5..76814afee92 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -1566,7 +1566,7 @@ PresShell::PresShell(): if (! gLog) gLog = PR_NewLogModule("PresShell"); #endif - mSelectionFlags = nsISelectionDisplay::DISPLAY_TEXT; + mSelectionFlags = nsISelectionDisplay::DISPLAY_TEXT | nsISelectionDisplay::DISPLAY_IMAGES; } NS_IMPL_ADDREF(PresShell) diff --git a/layout/base/public/Makefile.in b/layout/base/public/Makefile.in index 914cb31a48b..61dc12cdb39 100644 --- a/layout/base/public/Makefile.in +++ b/layout/base/public/Makefile.in @@ -82,6 +82,7 @@ endif XPIDLSRCS = \ nsIChromeEventHandler.idl \ + nsISelectionImageService.idl \ $(NULL) include $(topsrcdir)/config/rules.mk diff --git a/layout/base/public/nsISelectionImageService.idl b/layout/base/public/nsISelectionImageService.idl new file mode 100644 index 00000000000..ca471cacffa --- /dev/null +++ b/layout/base/public/nsISelectionImageService.idl @@ -0,0 +1,43 @@ +/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Mozilla browser. + * + * The Initial Developer of the Original Code is Netscape + * Communications, Inc. Portions created by Netscape are + * Copyright (C) 1999, Mozilla. All Rights Reserved. + * + */ + +#include "nsISupports.idl" + +%{ C++ +class imgIContainer; +%} + +[ptr] native imgIContainer(imgIContainer); + + +[uuid(f6f68e3c-f078-4235-bf71-53d180c37d26)] +interface nsISelectionImageService : nsISupports +{ + /** + * the current image is marked as invalid + */ + void reset(); + + /** + * retrieve the image for alpha blending + */ + void getImage(in short selectionValue, out imgIContainer container); + +}; diff --git a/layout/base/src/nsPresContext.cpp b/layout/base/src/nsPresContext.cpp index bed41bb65c1..56b03d8f6ad 100644 --- a/layout/base/src/nsPresContext.cpp +++ b/layout/base/src/nsPresContext.cpp @@ -33,8 +33,7 @@ * the provisions above, a recipient may use your version of this file under * the terms of any one of the NPL, the GPL or the LGPL. * - * ***** END LICENSE BLOCK ***** */ -#include "nsCOMPtr.h" + * ***** END LICENSE BLOCK ***** */#include "nsCOMPtr.h" #include "nsPresContext.h" #include "nsIPresShell.h" #include "nsIPref.h" @@ -77,6 +76,9 @@ #include "nsIDOMHTMLImageElement.h" #include "nsIImageFrame.h" +//needed for resetting of image service color +#include "nsLayoutCID.h" +#include "nsISelectionImageService.h" static nscolor MakeColorPref(const char *colstr) @@ -130,6 +132,8 @@ PR_STATIC_CALLBACK(PRBool) destroy_loads(nsHashKey *aKey, void *aData, void* clo static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID); #include "nsContentCID.h" static NS_DEFINE_CID(kEventStateManagerCID, NS_EVENTSTATEMANAGER_CID); +static NS_DEFINE_CID(kSelectionImageService, NS_SELECTIONIMAGESERVICE_CID); + nsPresContext::nsPresContext() : mDefaultVariableFont("serif", NS_FONT_STYLE_NORMAL, NS_FONT_VARIANT_NORMAL, @@ -1734,6 +1738,13 @@ nsPresContext::SysColorChanged() mShell->GetStyleSet(getter_AddRefs(set)); set->ClearStyleData(this, nsnull, nsnull); } + nsCOMPtr imageService; + nsresult result; + imageService = do_GetService(kSelectionImageService, &result); + if (NS_SUCCEEDED(result) && imageService) + { + imageService->Reset(); + } return NS_OK; } diff --git a/layout/build/nsLayoutCID.h b/layout/build/nsLayoutCID.h index 1dce6990e07..3396f37ac49 100644 --- a/layout/build/nsLayoutCID.h +++ b/layout/build/nsLayoutCID.h @@ -250,4 +250,8 @@ #define NS_LAYOUT_HISTORY_STATE_CID \ { 0x5c5af390, 0x34be, 0x11d5, { 0xa0, 0x3b, 0x00, 0x10, 0xa4, 0xef, 0x48, 0xc9 } } +// {9d1001b1-e59a-456b-99dc-cc3f1283236e} +#define NS_SELECTIONIMAGESERVICE_CID \ +{ 0x9d1001b1, 0xe59a, 0x456b, { 0x99, 0xdc, 0xcc, 0x3f, 0x12, 0x83, 0x23, 0x6e } } + #endif /* nsLayoutCID_h__ */ diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index 5757af6a1a2..b05313c44d4 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -62,6 +62,7 @@ #include "nsColorNames.h" // to addref/release table #include "nsCSSFrameConstructor.h" #include "nsSpaceManager.h" +#include "nsISelectionImageService.h" #ifdef INCLUDE_XUL #include "nsXULAtoms.h" @@ -188,6 +189,7 @@ extern nsresult NS_CreateFrameTraversal(nsIFrameTraversal** aResult); extern nsresult NS_CreateCSSFrameConstructor(nsICSSFrameConstructor** aResult); extern nsresult NS_NewLayoutHistoryState(nsILayoutHistoryState** aResult); extern nsresult NS_NewAutoCopyService(nsIAutoCopyService** aResult); +extern nsresult NS_NewSelectionImageService(nsISelectionImageService** aResult); #define MAKE_CTOR(ctor_, iface_, func_) \ static NS_IMETHODIMP \ @@ -228,6 +230,7 @@ MAKE_CTOR(CreateNewIFrameBoxObject, nsIBoxObject, NS_NewIFrameBoxO MAKE_CTOR(CreateNewScrollBoxObject, nsIBoxObject, NS_NewScrollBoxObject) MAKE_CTOR(CreateNewTreeBoxObject, nsIBoxObject, NS_NewTreeBoxObject) MAKE_CTOR(CreateNewAutoCopyService, nsIAutoCopyService, NS_NewAutoCopyService) +MAKE_CTOR(CreateSelectionImageService, nsISelectionImageService,NS_NewSelectionImageService) // The list of components we register static const nsModuleComponentInfo gComponents[] = { @@ -258,6 +261,11 @@ static const nsModuleComponentInfo gComponents[] = { nsnull, CreateNewLayoutHistoryState }, + { "selection image storage", + NS_SELECTIONIMAGESERVICE_CID, + nsnull, + CreateSelectionImageService}, + // XXX ick { "Presentation shell", NS_PRESSHELL_CID, diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 2ab34bd66fe..4e820a5f694 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -90,7 +90,16 @@ // For triple-click pref #include "nsIPref.h" #include "nsIServiceManager.h" -static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);//for tripple click pref +#include "nsISelectionImageService.h" +#include "imgIContainer.h" +#include "gfxIImageFrame.h" +#include "nsILookAndFeel.h" +#include "nsLayoutCID.h" +#include "nsWidgetsCID.h" // for NS_LOOKANDFEEL_CID + +static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);//for triple click pref +static NS_DEFINE_CID(kSelectionImageService, NS_SELECTIONIMAGESERVICE_CID); +static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID); // Some Misc #defines @@ -224,6 +233,175 @@ nsIFrameDebug::RootFrameList(nsIPresContext* aPresContext, FILE* out, PRInt32 aI #endif // end nsIFrameDebug + +// frame image selection drawing service implementation +class SelectionImageService : public nsISelectionImageService +{ +public: + SelectionImageService(); + virtual ~SelectionImageService(); + NS_DECL_ISUPPORTS + NS_DECL_NSISELECTIONIMAGESERVICE +private: + nsresult CreateImage(nscolor aImageColor, imgIContainer *aContainer); + nsCOMPtr mContainer; + nsCOMPtr mDisabledContainer; +}; + +NS_IMPL_ISUPPORTS1(SelectionImageService, nsISelectionImageService) + +SelectionImageService::SelectionImageService() +{ + NS_INIT_ISUPPORTS(); +} + +SelectionImageService::~SelectionImageService() +{ +} + +NS_IMETHODIMP +SelectionImageService::GetImage(PRInt16 aSelectionValue, imgIContainer **aContainer) +{ + nsresult result; + if (aSelectionValue != nsISelectionController::SELECTION_ON) + { + if (!mDisabledContainer) + { + mDisabledContainer = do_CreateInstance("@mozilla.org/image/container;1",&result); + if (NS_FAILED(result)) + return result; + if (mDisabledContainer) + { + nscolor disabledTextColor = NS_RGB(255, 255, 255); + nsCOMPtr look; + look = do_GetService(kLookAndFeelCID,&result); + if (NS_SUCCEEDED(result) && look) + look->GetColor(nsILookAndFeel::eColor_TextSelectBackgroundDisabled, disabledTextColor); + CreateImage(disabledTextColor, mDisabledContainer); + } + } + *aContainer = mDisabledContainer; + } + else + { + if (!mContainer) + { + mContainer = do_CreateInstance("@mozilla.org/image/container;1",&result); + if (NS_FAILED(result)) + return result; + if (mContainer) + { + nscolor selectionTextColor = NS_RGB(255, 255, 255); + nsCOMPtr look; + look = do_GetService(kLookAndFeelCID,&result); + if (NS_SUCCEEDED(result) && look) + look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, selectionTextColor); + CreateImage(selectionTextColor, mContainer); + } + } + *aContainer = mContainer; + } + if (!*aContainer) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(*aContainer); + return NS_OK; +} + +NS_IMETHODIMP +SelectionImageService::Reset() +{ + mContainer = 0; + mDisabledContainer = 0; + return NS_OK; +} + +//macintosh uses XRGB in its image format. its triple color (RGB) therefore is 4 bytes not 3 +#if defined(XP_MAC) || defined(XP_MACOSX) +#define SEL_TRIPLESIZE 4 +#else +#define SEL_TRIPLESIZE 3 +#endif + +#define SEL_IMAGE_WIDTH 32 +#define SEL_IMAGE_HEIGHT 32 +#define SEL_WIDTH_BYTES SEL_IMAGE_WIDTH * SEL_TRIPLESIZE +#define SEL_ALPHA_AMOUNT 128 +#define SEL_IMAGE_ALPHA_SIZE SEL_IMAGE_WIDTH*SEL_IMAGE_HEIGHT +#define SEL_IMAGE_TOTAL_SIZE SEL_WIDTH_BYTES * SEL_IMAGE_HEIGHT + +nsresult +SelectionImageService::CreateImage(nscolor aImageColor, imgIContainer *aContainer) +{ + if (aContainer) + { + nsresult result = aContainer->Init(SEL_IMAGE_WIDTH,SEL_IMAGE_HEIGHT,nsnull); + if (NS_SUCCEEDED(result)) + { + nsCOMPtr image = do_CreateInstance("@mozilla.org/gfx/image/frame;2",&result); + if (NS_SUCCEEDED(result) && image) + { + image->Init(0, 0, SEL_IMAGE_WIDTH, SEL_IMAGE_HEIGHT, gfxIFormats::RGB_A8); + aContainer->AppendFrame(image); + //its better to temporarily go after heap than put big data on stack + unsigned char *data = (unsigned char *)malloc(SEL_IMAGE_TOTAL_SIZE); + if (!data) + return NS_ERROR_OUT_OF_MEMORY; + unsigned char *alpha = (unsigned char *)malloc(SEL_IMAGE_ALPHA_SIZE); + if (!alpha) + { + free(data); + return NS_ERROR_OUT_OF_MEMORY; + } + PRInt16 i; + for (i = 0; i < SEL_WIDTH_BYTES; i+=SEL_TRIPLESIZE) + { +#ifdef XP_PC + data[i] = NS_GET_B(aImageColor); + data[i+1] = NS_GET_G(aImageColor); + data[i+2] = NS_GET_R(aImageColor); +#endif +#ifdef XP_UNIX + data[i] = NS_GET_R(aImageColor); + data[i+1] = NS_GET_G(aImageColor); + data[i+2] = NS_GET_B(aImageColor); +#endif +#if defined(XP_MAC) || defined(XP_MACOSX) + data[i] = 0 + data[i+1] = NS_GET_R(aImageColor); + data[i+2] = NS_GET_G(aImageColor); + data[i+3] = NS_GET_B(aImageColor); +#endif + } + unsigned char *data_cur = data+SEL_WIDTH_BYTES; + for (i = 1; i < SEL_IMAGE_HEIGHT; ++i, data_cur+=SEL_WIDTH_BYTES) + { + memcpy((void *)data_cur,(void *)data,SEL_WIDTH_BYTES); + } + memset((void *)alpha,SEL_ALPHA_AMOUNT,SEL_IMAGE_ALPHA_SIZE); + image->SetImageData(data,SEL_IMAGE_TOTAL_SIZE, SEL_IMAGE_TOTAL_SIZE-SEL_WIDTH_BYTES); + image->SetAlphaData(alpha,SEL_IMAGE_ALPHA_SIZE,SEL_IMAGE_ALPHA_SIZE-SEL_IMAGE_WIDTH); + free(data); + free(alpha); + return NS_OK; + } + } + } + return NS_ERROR_FAILURE; +} + + +nsresult NS_NewSelectionImageService(nsISelectionImageService** aResult) +{ + *aResult = new SelectionImageService; + if (!*aResult) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(*aResult); + return NS_OK; +} + + +//end selection service + // a handy utility to set font void SetFontFromStyle(nsIRenderingContext* aRC, nsIStyleContext* aSC) { @@ -661,6 +839,10 @@ void ForceDrawFrame(nsIPresContext* aPresContext, nsFrame * aFrame)//, PRBool) } } + + + + NS_IMETHODIMP nsFrame::Paint(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, @@ -742,9 +924,22 @@ nsFrame::Paint(nsIPresContext* aPresContext, rect.height-=2; rect.x=1; //we are in the coordinate system of the frame now with regards to the rendering context. rect.y=1; - aRenderingContext.SetColor(NS_RGB(0,0,255)); - nsRect drawrect(rect.x, rect.y, rect.width, rect.height); - aRenderingContext.DrawRect(drawrect); + + nsCOMPtr imageService; + imageService = do_GetService(kSelectionImageService, &result); + if (NS_SUCCEEDED(result) && imageService) + { + nsCOMPtr container; + imageService->GetImage(selectionValue, getter_AddRefs(container)); + if (container) + { + nsRect rect(0, 0, mRect.width, mRect.height); + aRenderingContext.DrawTile(container,0,0, &rect); + } + } + + + SelectionDetails *deletingDetails = details; while ((deletingDetails = details->mNext) != nsnull) { delete details; @@ -2872,11 +3067,6 @@ nsFrame::SetSelected(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool a */ nsFrameState frameState; GetFrameState(&frameState); - PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT); - if (aSelected == isSelected) //allready set thanks - { - return NS_OK; - } if ( aSelected ){ frameState |= NS_FRAME_SELECTED_CONTENT; } diff --git a/layout/html/base/src/nsFrame.cpp b/layout/html/base/src/nsFrame.cpp index 2ab34bd66fe..4e820a5f694 100644 --- a/layout/html/base/src/nsFrame.cpp +++ b/layout/html/base/src/nsFrame.cpp @@ -90,7 +90,16 @@ // For triple-click pref #include "nsIPref.h" #include "nsIServiceManager.h" -static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);//for tripple click pref +#include "nsISelectionImageService.h" +#include "imgIContainer.h" +#include "gfxIImageFrame.h" +#include "nsILookAndFeel.h" +#include "nsLayoutCID.h" +#include "nsWidgetsCID.h" // for NS_LOOKANDFEEL_CID + +static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);//for triple click pref +static NS_DEFINE_CID(kSelectionImageService, NS_SELECTIONIMAGESERVICE_CID); +static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID); // Some Misc #defines @@ -224,6 +233,175 @@ nsIFrameDebug::RootFrameList(nsIPresContext* aPresContext, FILE* out, PRInt32 aI #endif // end nsIFrameDebug + +// frame image selection drawing service implementation +class SelectionImageService : public nsISelectionImageService +{ +public: + SelectionImageService(); + virtual ~SelectionImageService(); + NS_DECL_ISUPPORTS + NS_DECL_NSISELECTIONIMAGESERVICE +private: + nsresult CreateImage(nscolor aImageColor, imgIContainer *aContainer); + nsCOMPtr mContainer; + nsCOMPtr mDisabledContainer; +}; + +NS_IMPL_ISUPPORTS1(SelectionImageService, nsISelectionImageService) + +SelectionImageService::SelectionImageService() +{ + NS_INIT_ISUPPORTS(); +} + +SelectionImageService::~SelectionImageService() +{ +} + +NS_IMETHODIMP +SelectionImageService::GetImage(PRInt16 aSelectionValue, imgIContainer **aContainer) +{ + nsresult result; + if (aSelectionValue != nsISelectionController::SELECTION_ON) + { + if (!mDisabledContainer) + { + mDisabledContainer = do_CreateInstance("@mozilla.org/image/container;1",&result); + if (NS_FAILED(result)) + return result; + if (mDisabledContainer) + { + nscolor disabledTextColor = NS_RGB(255, 255, 255); + nsCOMPtr look; + look = do_GetService(kLookAndFeelCID,&result); + if (NS_SUCCEEDED(result) && look) + look->GetColor(nsILookAndFeel::eColor_TextSelectBackgroundDisabled, disabledTextColor); + CreateImage(disabledTextColor, mDisabledContainer); + } + } + *aContainer = mDisabledContainer; + } + else + { + if (!mContainer) + { + mContainer = do_CreateInstance("@mozilla.org/image/container;1",&result); + if (NS_FAILED(result)) + return result; + if (mContainer) + { + nscolor selectionTextColor = NS_RGB(255, 255, 255); + nsCOMPtr look; + look = do_GetService(kLookAndFeelCID,&result); + if (NS_SUCCEEDED(result) && look) + look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, selectionTextColor); + CreateImage(selectionTextColor, mContainer); + } + } + *aContainer = mContainer; + } + if (!*aContainer) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(*aContainer); + return NS_OK; +} + +NS_IMETHODIMP +SelectionImageService::Reset() +{ + mContainer = 0; + mDisabledContainer = 0; + return NS_OK; +} + +//macintosh uses XRGB in its image format. its triple color (RGB) therefore is 4 bytes not 3 +#if defined(XP_MAC) || defined(XP_MACOSX) +#define SEL_TRIPLESIZE 4 +#else +#define SEL_TRIPLESIZE 3 +#endif + +#define SEL_IMAGE_WIDTH 32 +#define SEL_IMAGE_HEIGHT 32 +#define SEL_WIDTH_BYTES SEL_IMAGE_WIDTH * SEL_TRIPLESIZE +#define SEL_ALPHA_AMOUNT 128 +#define SEL_IMAGE_ALPHA_SIZE SEL_IMAGE_WIDTH*SEL_IMAGE_HEIGHT +#define SEL_IMAGE_TOTAL_SIZE SEL_WIDTH_BYTES * SEL_IMAGE_HEIGHT + +nsresult +SelectionImageService::CreateImage(nscolor aImageColor, imgIContainer *aContainer) +{ + if (aContainer) + { + nsresult result = aContainer->Init(SEL_IMAGE_WIDTH,SEL_IMAGE_HEIGHT,nsnull); + if (NS_SUCCEEDED(result)) + { + nsCOMPtr image = do_CreateInstance("@mozilla.org/gfx/image/frame;2",&result); + if (NS_SUCCEEDED(result) && image) + { + image->Init(0, 0, SEL_IMAGE_WIDTH, SEL_IMAGE_HEIGHT, gfxIFormats::RGB_A8); + aContainer->AppendFrame(image); + //its better to temporarily go after heap than put big data on stack + unsigned char *data = (unsigned char *)malloc(SEL_IMAGE_TOTAL_SIZE); + if (!data) + return NS_ERROR_OUT_OF_MEMORY; + unsigned char *alpha = (unsigned char *)malloc(SEL_IMAGE_ALPHA_SIZE); + if (!alpha) + { + free(data); + return NS_ERROR_OUT_OF_MEMORY; + } + PRInt16 i; + for (i = 0; i < SEL_WIDTH_BYTES; i+=SEL_TRIPLESIZE) + { +#ifdef XP_PC + data[i] = NS_GET_B(aImageColor); + data[i+1] = NS_GET_G(aImageColor); + data[i+2] = NS_GET_R(aImageColor); +#endif +#ifdef XP_UNIX + data[i] = NS_GET_R(aImageColor); + data[i+1] = NS_GET_G(aImageColor); + data[i+2] = NS_GET_B(aImageColor); +#endif +#if defined(XP_MAC) || defined(XP_MACOSX) + data[i] = 0 + data[i+1] = NS_GET_R(aImageColor); + data[i+2] = NS_GET_G(aImageColor); + data[i+3] = NS_GET_B(aImageColor); +#endif + } + unsigned char *data_cur = data+SEL_WIDTH_BYTES; + for (i = 1; i < SEL_IMAGE_HEIGHT; ++i, data_cur+=SEL_WIDTH_BYTES) + { + memcpy((void *)data_cur,(void *)data,SEL_WIDTH_BYTES); + } + memset((void *)alpha,SEL_ALPHA_AMOUNT,SEL_IMAGE_ALPHA_SIZE); + image->SetImageData(data,SEL_IMAGE_TOTAL_SIZE, SEL_IMAGE_TOTAL_SIZE-SEL_WIDTH_BYTES); + image->SetAlphaData(alpha,SEL_IMAGE_ALPHA_SIZE,SEL_IMAGE_ALPHA_SIZE-SEL_IMAGE_WIDTH); + free(data); + free(alpha); + return NS_OK; + } + } + } + return NS_ERROR_FAILURE; +} + + +nsresult NS_NewSelectionImageService(nsISelectionImageService** aResult) +{ + *aResult = new SelectionImageService; + if (!*aResult) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(*aResult); + return NS_OK; +} + + +//end selection service + // a handy utility to set font void SetFontFromStyle(nsIRenderingContext* aRC, nsIStyleContext* aSC) { @@ -661,6 +839,10 @@ void ForceDrawFrame(nsIPresContext* aPresContext, nsFrame * aFrame)//, PRBool) } } + + + + NS_IMETHODIMP nsFrame::Paint(nsIPresContext* aPresContext, nsIRenderingContext& aRenderingContext, @@ -742,9 +924,22 @@ nsFrame::Paint(nsIPresContext* aPresContext, rect.height-=2; rect.x=1; //we are in the coordinate system of the frame now with regards to the rendering context. rect.y=1; - aRenderingContext.SetColor(NS_RGB(0,0,255)); - nsRect drawrect(rect.x, rect.y, rect.width, rect.height); - aRenderingContext.DrawRect(drawrect); + + nsCOMPtr imageService; + imageService = do_GetService(kSelectionImageService, &result); + if (NS_SUCCEEDED(result) && imageService) + { + nsCOMPtr container; + imageService->GetImage(selectionValue, getter_AddRefs(container)); + if (container) + { + nsRect rect(0, 0, mRect.width, mRect.height); + aRenderingContext.DrawTile(container,0,0, &rect); + } + } + + + SelectionDetails *deletingDetails = details; while ((deletingDetails = details->mNext) != nsnull) { delete details; @@ -2872,11 +3067,6 @@ nsFrame::SetSelected(nsIPresContext* aPresContext, nsIDOMRange *aRange, PRBool a */ nsFrameState frameState; GetFrameState(&frameState); - PRBool isSelected = ((frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT); - if (aSelected == isSelected) //allready set thanks - { - return NS_OK; - } if ( aSelected ){ frameState |= NS_FRAME_SELECTED_CONTENT; } diff --git a/layout/html/base/src/nsPresShell.cpp b/layout/html/base/src/nsPresShell.cpp index 5a78494b7e5..76814afee92 100644 --- a/layout/html/base/src/nsPresShell.cpp +++ b/layout/html/base/src/nsPresShell.cpp @@ -1566,7 +1566,7 @@ PresShell::PresShell(): if (! gLog) gLog = PR_NewLogModule("PresShell"); #endif - mSelectionFlags = nsISelectionDisplay::DISPLAY_TEXT; + mSelectionFlags = nsISelectionDisplay::DISPLAY_TEXT | nsISelectionDisplay::DISPLAY_IMAGES; } NS_IMPL_ADDREF(PresShell)